我正在努力设计Spring Batch作业。总体目标是检索大约2000万条记录并将它们保存到SQL数据库中。
我分两部分来做。首先,我检索要检索的2000万条记录,并将其保存到文件(或DB)中。这是一个相对快速的操作。其次,我遍历我的Ids文件,接受2,000个批次,并从外部服务检索其相关记录。然后我重复这个,一次2,000个ID,直到我检索完所有记录。对于我检索的每批2,000条记录,我将它们保存到数据库中。
有些人可能会问为什么我分两步这样做。我最终计划将第二步并行运行,以便我可以并行检索批量的2,000条记录,并希望大大加快下载速度。拥有Ids允许我将作业分成批次。现在,让我们不要担心并行性,只关注如何设计更简单的顺序作业。
想象一下,我已经解决了在本地保存所有ID的第一个问题。它们位于文件中,每行一个Id。如何设计第二部分的步骤?
这就是我在想的......
使用平面文件阅读器读取2,000个ID。我需要一个聚合器,因为我只想为每批2K ID对我的外部服务进行一次查询。这是我在努力的地方。我是否嵌套了一系列读者?或者我可以在处理器或编写器中“阅读”吗?
基本上,我的问题是我想从文件中读取行,聚合这些行,然后立即执行另一次“读取”以检索相应的记录。我几乎想把读者连在一起。
最后,一旦我从外部服务中检索了记录,我就会有一个记录列表。这意味着当他们到达作家时,我会有一份清单。我想要一个对象列表,以便我可以开箱即用JdbcItemWriter。
思考?希望这是有道理的。
安德鲁
答案 0 :(得分:0)
这是设计问题并且是主观的,但基于我发现的Spring Batch示例(来自SpringSource)和我的个人经验,在处理器步骤中进行附加读取的模式是解决此问题的一个很好的解决方案。您还可以将“处理器”中的多个处理器/阅读器链接在一起。步。所以,虽然这些名字并不完全匹配,但我发现自己越来越多地阅读'在我的处理器中。
[http://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#drivingQueryBasedItemReaders][1]
答案 1 :(得分:0)
鉴于您希望每个2.000条记录只调用一次外部服务,您实际上希望在ItemWriter
中进行此服务调用。这是进行块级处理的标准推荐方法。
您可以创建自定义ItemWriter<Long>
实施。它将接收2.000个ID列表作为输入,并调用外部服务。外部服务的结果应该允许您创建List<Item>
。然后,您的作者可以将此List<Item>
转发给您的JdbcItemWriter<Item>
代表。