【发布时间】:2020-07-19 02:23:31
【问题描述】:
我们有一个以主从模式运行的 Spring Batch 应用程序。在 master 端有一个 Reader,它查询源数据库并在将记录推送到中间表之前对记录进行一些处理。
发生这种情况时,主服务器也会并行启动从服务器。这些从属从中间表中读取受其分区约束的记录并同时开始处理它们,有5个从属在中间表中具有不同的记录分区要处理。
Master 和 Slaves 在不同的 JVM 中运行。
主设备使用 MessageChannelPartitionHandler 与从设备通信。在从机端,有一个服务激活器,它触发从中间表读取和处理记录的步骤。服务激活发生在分区消息到达指定通道时。完成后,每个从设备通过回复通道向主设备确认。
假设,如果在从源数据库中提取记录时在 Master 端出现问题,或者在将记录插入中间表时存在一些网络延迟。从属服务器看不到任何新的分区记录,因此它们的读取器会自动关闭,并且它们会过早地开始向主服务器发送回复。
但是,master端的进程还没有完全完成。从属步骤完成后,中间表中可能会有更多新记录。当这种情况发生时,所有这些溢出的记录只能在下一次 Job 运行期间进行处理。
当这种情况发生时,有没有办法从主服务器再次触发从服务器上的服务激活?换句话说,我们是否可以强制slave等到master的处理完全完成并且中间表中的所有记录都可用时,才向master发送回复消息?
【问题讨论】:
标签: java spring-batch