2014-09-20 42 views
0

我很苦恼如何设计春季批处理作业。总体目标是检索约2000万条记录并将它们保存到sql数据库。春季批处理作业设计 - 多读者

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

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

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

下面是我在想什么......

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

本质上,我的问题是我想从文件读取行,聚合这些行,然后立即做另一个“读取”来检索相应的记录。我几乎想要将读者联系在一起。

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

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

安德鲁

+0

我刚刚在文档中找到了这个例子,似乎表明我应该在处理器中检索完整对象(使用来自阅读器的ID)。也许我会从字面上理解这些接口名称。处理器中的“读取”感觉很奇怪。 HTTP://docs.spring。IO /弹簧分批/中继/参考/ HTML/patterns.html#drivingQueryBasedItemReaders – anschoewe 2014-09-20 20:49:44

回答

0

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

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

既然你想每块只有一次调用2.000记录您的外部服务,你会真正想做的事在这个ItemWriter服务调用。这是进行块级处理的标准推荐方式。

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

相关问题