Spring 批处理 - 重新触发服务激活器

Spring Batch - Re-triggering Service Activator

我们有一个 Spring 批处理应用程序,它 运行 处于主从模式。在 master 端有一个 Reader,它查询源数据库并在将记录推送到中间 table 之前对记录进行一些处理。

发生这种情况时,master 也会并行启动 slaves。这些slaves从中间table中读取受其分区影响的记录并同时开始处理它们,有5个slave在中间table中有不同的记录分区要处理。

Master 和 Slaves 运行 在不同的 JVM 中。

master使用MessageChannelPartitionHandler与slave进行通信。在slave端,有一个Service Activator触发了从中间table读取和处理记录的步骤。服务激活发生在分区消息到达指定通道时。完成后,每个从站通过回复通道向主站确认。

假设,如果在从源数据库中提取记录时在 Master 端出现问题,或者在将记录插入中间数据库时出现网络延迟 table。奴隶看不到他们分区的任何新记录,因此他们的阅读器自动关闭,他们过早地开始向主人发送回复。

不过,master端的处理还没有完全完成。从属步骤完成后,中间可以有更多的新记录table。当这种情况发生时,所有这些溢出的记录只能在下一个 Job 运行 中处理。

遇到这种情况,有没有办法让master在slave上再次触发Service Activation?换句话说,我们是否可以强制slaves等到master的处理完全完成并且中间的所有记录都可用table,然后才向master发送回复消息?

After the slave steps are completed there can be some more new records in the intermediate table

批处理就是处理固定个数据集。如果数据源在移动,就变成了流处理。为作业分配固定数据集可实现可重启性。

根据您的设计,分区不是固定的。所以你需要确保每个slave处理一组固定的记录或者改用流式解决方案。