【问题标题】:Spring Batch Job Design -Multiple ReadersSpring Batch Job 设计 - 多读者
【发布时间】:2014-09-20 20:41:02
【问题描述】:

我正在为如何设计 Spring Batch 作业而苦恼。总体目标是检索约 2000 万条记录并将它们保存到 sql 数据库中。

我分两部分来做。首先,我检索我想要检索的记录的 2000 万个 ID,并将它们保存到文件(或 DB)中。这是一个相对较快的操作。其次,我遍历我的 Ids 文件,批量获取 2,000 个,并从外部服务检索它们的相关记录。然后我重复这个,一次 2,000 个 ID,直到我检索到所有记录。对于我检索的每批 2,000 条记录,我将它们保存到数据库中。

有些人可能会问我为什么要分两步这样做。我最终计划使第二步并行运行,以便我可以并行检索 2,000 条记录的批次,并希望大大加快下载速度。拥有 ID 可以让我将作业分成多个批次。现在,让我们不要担心并行性,而只关注如何设计更简单的顺序作业。

想象一下,我已经解决了在本地保存所有 Id 的第一个问题。它们在一个文件中,每行一个 Id。如何设计第二部分的步骤?

这就是我的想法……

使用平面文件阅读器读取 2,000 个 ID。我需要一个聚合器,因为我只想为每批 2K Id 对我的外部服务进行一次查询。这就是我挣扎的地方。我是否嵌套了一系列阅读器?或者我可以在处理器或写入器中“读取”吗?

本质上,我的问题是我想从文件中读取行,聚合这些行,然后立即进行另一次“读取”以检索相应的记录。我几乎想把读者链接在一起。

最后,一旦我从外部服务中检索了记录,我就会有一个记录列表。这意味着当他们到达作家那里时,我会有一份清单。我想要一个对象列表,以便我可以使用开箱即用的 JdbcItemWriter。

想法?希望这是有道理的。

安德鲁

【问题讨论】:

  • 我刚刚在文档中找到了这个示例,似乎建议我应该在处理器中检索完整的对象(使用来自阅读器的 id)。也许我对这些接口名称的理解有点过于字面了。在处理器中“读取”感觉很奇怪。 docs.spring.io/spring-batch/trunk/reference/html/…

标签: java spring replication batch-processing spring-batch


【解决方案1】:

这是一个设计问题并且是主观的,但是基于我发现的 Spring Batch 示例(来自 SpringSource)和我的个人经验,在处理器步骤中进行附加读取的模式是解决这个问题的一个很好的方法。您还可以在“处理器”步骤中将多个处理器/阅读器链接在一起。因此,虽然名称不完全匹配,但我发现自己在我的处理器中进行越来越多的“阅读”。

[http://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#drivingQueryBasedItemReaders][1]

【讨论】:

    【解决方案2】:

    假设您只想在每块 2000 条记录中调用一次外部服务,您实际上会希望在 ItemWriter 中执行此服务调用。这是进行块级处理的标准推荐方法。

    您可以创建自定义ItemWriter<Long> 实现。它将接收 2.000 个 ID 的列表作为输入,并调用外部服务。外部服务的结果应该允许您创建一个List<Item>。然后,您的作者可以简单地将这个 List<Item> 转发给您的 JdbcItemWriter<Item> 代表。

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多