当BJ当前正在RUNNING时,如果服务器已停止,即使在服务器停止后,Spring Batch Admin中的BATCH JOB状态仍然显示其RUNNING,需要为FAILED
请帮忙解决这个问题?我们是否需要手动处理它,或者我们可以开箱即用。 在这方面需要帮助吗?
作业存储库(数据库实现)反映了最后的“已知”状态。因此,在作业正在运行且 JVM 崩溃的情况下,它将永远不会在数据库中更新。
如果数据库与 JVM“不同步”,则该过程需要手动进行,似乎没有开箱即用的解决方案。最简单的解决方案是在启动时执行一个脚本,该脚本检查批处理表中是否有任何正在运行的作业,然后将其“失败”。
update batch_job_execution set STATUS = 'FAILED', EXIT_CODE = 'FAILED', EXIT_MESSAGE = 'FORCED UPDATE' where job_execution_id in (select job_execution_id from batch_job_execution where status = 'RUNNING');
在这种情况下,您需要考虑的一件事是,JobRepository 表以及与之关联的作业是否与另一个 JVM 共享。在这种情况下,您可能希望执行一个传递,该传递还可以评估作业是否仍在运行,超过它拥有的任何历史记录的最大运行时间。 (具有 max() end_time 的子选择 - 相同 job_name 的 create_time)
更新失败状态的批处理表以继续前进
-- batch_step_execution
UPDATE batch_step_execution
SET
end_time = sysdate,
last_updated = sysdate,
status = 'COMPLETED',
exit_code = 'FAILED'
WHERE
step_execution_id IN (
SELECT
step_execution_id
FROM
batch_step_execution bse
WHERE
1 = 1
AND status NOT IN ( 'COMPLETED', 'FAILED' )
OR exit_code NOT IN ( 'COMPLETED', 'FAILED' )
);
-- batch_job_execution
UPDATE batch_job_execution
SET
end_time = sysdate,
last_updated = sysdate,
status = 'COMPLETED',
exit_code = 'FAILED'
WHERE
job_execution_id IN (
SELECT
bje.job_execution_id
FROM
batch_job_execution bje
WHERE
1 = 1
AND ( status NOT IN ( 'COMPLETED', 'FAILED' ) )
OR ( exit_code NOT IN ( 'COMPLETED', 'FAILED' ) )
);