我正在实现一项服务,如果现有作业正在运行,该服务将拒绝处理作业请求。不幸的是,我不确定是否有办法区分正在运行的作业和由于意外关闭(例如关闭 Tomcat)而结束的作业。表中的状态与 status = STARTED 和 exit_code = UNKNOWN 相同。
Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions("MY_JOB");
有没有办法区分这两者或实施将活动的工作状态更改为可能已放弃?
确实没有办法仅通过查看数据库来区分正在有效运行的作业和突然被终止的作业(在这两种情况下,状态都是
STARTED
)。
您需要做的是,除了检查数据库中的状态之外,还想找到一种方法来查看作业是否正在有效运行。这实际上取决于您如何开展工作。例如,如果您在单独的 JVM 中运行作业,则可以编写一些代码来检查当前是否有 JVM 正在运行您的作业。如果您将作业部署到 Kubernetes,您可以询问 Kubernetes 当前是否有 pod 正在运行您的作业等。
但是,如果您可以识别突然停止的执行,其状态一直停留在STARTED
(因为 Spring Batch 没有机会通过正常关闭将其状态更新为
FAILED
),那么您可以手动将状态更新为
ABANDONED
并将其
END_TIME
设置为非空值。这样,
JobExplorer#findRunningExecutions
将不再将其作为正在运行的执行返回。