手动更改Spring Batch Meta-Data表是不是一个坏主意?

son*_*yao 6 java spring-batch

背景

我正在使用Spring Batch 2.1.8,并运行作业CommandLineJobRunner.如:

java org.springframework.batch.core.launch.support.CommandLineJobRunner classpath:launchContext.xml theJobId
Run Code Online (Sandbox Code Playgroud)

问题

在某些情况下,例如服务器崩溃,可能会中断正在运行的作业.但中断的作业STARTED在Spring Batch Meta-Data表中保留了状态,无法再次运行.

org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running
Run Code Online (Sandbox Code Playgroud)

我可以想到两个解决方案:

解决方法1

添加一个新的作业参数并每次更改它以使其成为Spring Batch的"新"作业.如:

java org.springframework.batch.core.launch.support.CommandLineJobRunner classpath:launchContext.xml theJobId times=0
Run Code Online (Sandbox Code Playgroud)

当需要重新运行它时,请清除所有相应的输出数据,计数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'));
Run Code Online (Sandbox Code Playgroud)

我试过了,看起来效果很好.

Solution2是个坏主意吗?有陷阱吗?

提前致谢.并且赞赏任何其他解决方案.

Mic*_*lla 6

解决方案2是目前公认的方法.API不提供修复此方案的方法.过去曾要求框架自动清理,但99%的情况下,需要做出人为决定来确定是否真正需要清理.

我对选项2的唯一注意事项是检查BATCH_STEP_EXECUTION表,以查看最后执行步骤的状态.