Spring 批处理作业在任何时间仅运行一个实例

问题描述 投票:0回答:2

正在开发要部署在AWS ECS进程中的Spring Boot应用程序。该应用程序有 2 个 spring 批处理作业,由 cron 触发的服务层方法按顺序调用。 Job1 是基于tasklet 的,Job2 是基于块的(这里可能不相关)。应用程序数据和批处理元数据保存到相同的 Postgres DB 架构中。通过单个 ECS 进程,一切都按预期正常运行。我正在使用 @EnableBatchProcessing 注释来设置基本配置。

我想启用多个 ECS 进程,但确保在任何给定时间 Job1 或 Job2 仅在其中一个 ECS 进程中处于活动状态。但是,当Job1在ECS1中运行时,Job2在ECS2中运行是可以的。另一个要求是允许启动作业的服务代码使用 ExitStatus 或其他方式区分编程停止。

首先,我尝试使用 JobExecutionListener::beforeStep 和 JobExplorer + JobOperator 在另一个作业正在运行时停止该作业。但是,这会引发“关系batch_job_execution_params不存在”之类的异常。这是相当令人困惑的,因为该表存在于数据库中,并且实际上是由 Spring 批处理在启动时创建的。此外,如果没有 JobExplorer/JobOperator,Spring Batch 可以毫无问题地访问和维护其元数据表中的数据。尝试添加 SimpleJobOperator、JobRegistryBeanPostProcessor 等但无济于事。

为什么当批处理系统的其余部分能够访问元数据表时,JobExplorer/JobOperator 会抛出异常?另外,在启动作业之前或执行步骤然后自行中止之前,“原子地”识别作业的另一个实例是否正在运行的最简单方法是什么?无法使用限制,因为作业外部的代码也需要能够理解这种停止并避免其自身的某些操作(例如将文件移动到完成/无效文件夹)。寻找 Spring 批处理解决方案。如果不容易的话,我可以切换到 Quartz 调度程序或一些类似的工具。希望 Spring Batch 能够实现它,因为它在元数据表中具有共享状态。

spring-batch
2个回答

0
投票
同一个作业将触发 2 个 ECS Env。但我只需要触发一处。如何防止这种情况发生?

Spring Batch 的 Batch 域中定义的作业实例与应用程序实例之间存在差异。上面的描述混合了两者。

如果您正确设计作业实例(通过仔细设计识别作业参数),由于集中式作业存储库设计,Spring Batch 将确保一次执行一个作业实例,无论并行执行多少个应用程序实例.

© www.soinside.com 2019 - 2024. All rights reserved.