Java 如何实现Spring批处理远程处理并仍然保持写入顺序?

Java 如何实现Spring批处理远程处理并仍然保持写入顺序?,java,spring,batch-processing,spring-batch,Java,Spring,Batch Processing,Spring Batch,我是SpringBatch的新手,刚刚开始进行POC,以证明SpringBatch能够在一小时内处理1m条记录。然而,该体系结构要求我们也展示水平可伸缩性 我已经通读了Partitoning和remotechunking策略。对我来说,两者都有意义。两者之间的本质区别在于,远程分块需要一个持久的消息队列,因为对数据库或文件的实际写操作是从主机进行的。在分区过程中,不需要持久消息队列,因为写入是从机进行的 然而,我完全不知所措的是,如何确保以正确的顺序写出这两种并行处理变体的结果 让我们以聚会为例

我是SpringBatch的新手,刚刚开始进行POC,以证明SpringBatch能够在一小时内处理1m条记录。然而,该体系结构要求我们也展示水平可伸缩性

我已经通读了Partitoning和remotechunking策略。对我来说,两者都有意义。两者之间的本质区别在于,远程分块需要一个持久的消息队列,因为对数据库或文件的实际写操作是从主机进行的。在分区过程中,不需要持久消息队列,因为写入是从机进行的

然而,我完全不知所措的是,如何确保以正确的顺序写出这两种并行处理变体的结果

让我们以聚会为例。据我所知,如果一个处理1000条记录的特定步骤被分成10个并行步骤执行,每个步骤都有自己的读卡器、处理器和写入器,那么其中一个执行很容易在另一个之前完成。结果是,其中一个步骤执行的ItemWriter可以在将处理200-300的结果写入同一个表之前将处理记录300-400的结果写入一个表,因为该特定步骤执行可能会滞后

这意味着现在我有了一个输出表,它确实包含了处理的所有结果,但它们的排序顺序不正确。可能需要进一步的顺序处理,只需将它们恢复到1到1000之间的正确排序顺序即可

我很难理解,如何通过SpringBatch中描述的远程处理策略确保正确的排序输出,同时水平扩展系统


这两本书我都读过。也一样,但这些书中也没有回答我的问题。

我认为你们不能这样做,因为表格自然是不排序的。如果您需要以某种方式对它们进行排序,请添加一个由writer管理的order列。第一个分区写1-100,第二个分区写101-200,依此类推。下一步,读者将通过[订单列]获取订单项。由于在以前的分区中缺少写入而导致的订单列之间的孔不是问题。我的2美分

我正转向类似的东西。我正在考虑实现StepExecutionListener并重写afterStep方法。所以,一旦项目编写器完成了它的工作,并且调用了afterStep,我将从afterStep调用一个数据库进程来对记录进行排序。如果您能够在afterStep中排序,为什么不在下一步中读取ordered并避免在listener中更新?如果sp出错,并且您在下一步中有未订购的项目?IMO数据更新应在事务生命周期(即chunck life)内完成(尽可能多)