背景
我正在使用 Spring Batch 2.1.8,并通过 CommandLineJobRunner
运行作业。如:
java org.springframework.batch.core.launch.support.CommandLineJobRunner classpath:launchContext.xml theJobId
问题
在某些情况下,例如服务器崩溃,正在运行的作业可能会中断。
但是被中断的作业在 Spring Batch 元数据表中留下了 STARTED
状态,并且无法再次运行。
org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running
我可以想到两种解决方案:
解决方案1
添加一个新的作业参数并每次更改它以使其成为 Spring Batch 的"new"作业。如:
java org.springframework.batch.core.launch.support.CommandLineJobRunner classpath:launchContext.xml theJobId times=0
当需要重新运行时,清除所有相应的输出数据,统计一次times
,然后重新运行作业。
解决方案2
手动更改 Spring Batch 元数据表。
更新状态以使作业可重新启动。如:
UPDATE BATCH_JOB_EXECUTION SET END_TIME = SYSTIMESTAMP, STATUS = 'FAILED', EXIT_CODE = 'FAILOVER' WHERE JOB_EXECUTION_ID =
(SELECT MAX(JOB_EXECUTION_ID) FROM BATCH_JOB_EXECUTION WHERE JOB_INSTANCE_ID =
(SELECT MAX(JOB_INSTANCE_ID) FROM BATCH_JOB_INSTANCE WHERE JOB_NAME = 'XXX'));
我试过了,效果不错。
问题
解决方案 2 是个坏主意吗?有没有陷阱?
提前致谢。并感谢任何其他解决方案。
最佳答案
解决方案 2 是目前公认的方法。 API 不提供解决此问题的方法。过去曾有人要求框架自动清理,但在 99% 的情况下,需要人工决定是否确实需要清理。
我对选项 2 的唯一注意事项是还要检查 BATCH_STEP_EXECUTION 表,以查看最后执行的步骤处于什么状态。
关于java - 手动更改 Spring Batch 元数据表是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22775233/