【发布时间】:2021-09-17 08:28:19
【问题描述】:
我们有一个 Spring Batch 应用程序计划每 30 分钟运行一次,它在云上创建工作人员作为单独的 pod。
在 Configuration 类中,其中一个 bean 连接到数据库并读取一些属性。如果此 DB 连接由于某种原因失败,则 Worker 不会启动,并且 Master 作业不会在 30 分钟后再次触发。
发生这种情况是因为如果 worker 在启动时失败,它不会更新 DB 中的最终状态,也不会将其作为 Failed 传达给主节点。因此,Master 假定它仍在运行并且不会再次触发 Batch。
对于如何处理这个问题以及如何确保 Master 在预定的时间内再次触发工作人员有任何建议吗?
【问题讨论】:
-
that creates workers on the Cloud as separate pods:工人是如何产生的?工人的生命周期是如何管理的?你能分享更多关于你的设置的细节吗? -
Workers 是使用 Docker 资源加载器创建的。主作业定期运行一个查询,获取要处理的记录列表。一旦有了列表,它会根据列表的大小生成一个或多个工作 pod,并在它们之间分配负载。然后这些工作 pod 处理数据,并进入 Completed 状态。
-
如果工人不报告,经理无法知道工人的状态。然而,管理员可以为此配置timeout。因此,如果您希望管理器在下一个计划运行之前失败,您需要将超时设置为低于 30 分钟的值。也就是说,我建议让每个计划都有自己的工作,这样失败的工作不会影响后续计划。
-
谢谢。是否还有一个方便的属性可以添加到 application.properties 来设置超时(找不到)或者我们必须通过代码设置它?
-
不,您可以在
MessageChannelPartitionHandler或通过构建器RemotePartitioningManagerStepBuilder#timeout设置超时。
标签: java spring spring-batch