繁体   English   中英

Spring Batch工作设计-多个读者

[英]Spring Batch Job Design -Multiple Readers

我正在努力设计Spring Batch作业。 总体目标是检索约2000万条记录并将其保存到sql数据库中。

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

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

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

这就是我的想法

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

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

最后,一旦我从外部服务中检索了记录,便有了记录列表。 这意味着当他们到达Writer时,我将获得一个列表列表。 我想要一个对象列表,以便可以直接使用JdbcItemWriter。

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

安德鲁

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

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

假设您只需要为每2.000条记录调用一次外部服务,您实际上将想在ItemWriter进行此服务调用。 这是进行块级处理的标准推荐方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM