java - Spring Batch - 重新触发服务激活器

标签 java spring-batch

我们有一个以主从模式运行的 Spring Batch 应用程序。在主端有一个读取器,它查询源数据库并对记录进行一些处理,然后将记录推送到中间表中。

发生这种情况时,主站也会并行启动从站。这些从站从中间表中读取受其分区约束的记录并同时开始处理它们,有 5 个从站需要处理中间表中不同分区的记录。

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

主站使用 MessageChannelPartitionHandler 与从站进行通信。在从站端,有一个服务激活器,它触发从中间表读取和处理记录的步骤。当分区消息到达指定 channel 时,服务激活就会发生。完成后,每个从设备都会通过回复 channel 向主设备确认。

假设,如果在从源数据库提取记录时主端出现一些问题,或者在将记录插入中间表时存在一些网络延迟。从服务器看不到其分区的任何新记录,因此它们的读取器会自动关闭,并且它们过早地开始向主服务器发送回复。

但是,master端的流程还没有完全完成。从属步骤完成后,中间表中可能会出现更多新记录。当这种情况发生时,所有这些溢出的记录只能在下一次作业运行期间进行处理。

当这种情况发生时,是否有办法从主站再次触发从站上的服务激活?换句话说,我们是否可以强制从设备等待主设备的处理完全完成并且所有记录都在中间表中可用,然后才向主设备发送回复消息?

最佳答案

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

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

根据您的设计,分区不是固定的。因此,您需要确保每个从站处理一组固定的记录或改用流解决方案。

关于java - Spring Batch - 重新触发服务激活器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61070785/

相关文章:

java - 如何使用执行上下文将文件名发送到监听器?

java - 如何使用作业参数替换从文件加载 bean 值?

multithreading - Spring Batch线程安全的ItemReader(过程指示器模式)

java - Spring Autowiring 依赖,具有构造函数参数

java - 手动更改 Spring Batch 元数据表是个坏主意吗?

java - 模拟一个具有一些由随机值生成的字段的类?

java - 如何实现自调整二叉搜索树?

spring-batch - Spring Batch Admin - 如何隐藏标准菜单,例如主页和文件菜单

java - IntelliJ 命令行编译器

java - 是否可以将 ViewFlipper 扩展为自定义 View ,以便更改预览中的初始页面?