无法重新启动Spring批处理作业

我有一个 spring 批处理作业,它可以读取,转换和写入Oracle数据库 . 我通过CommandLineJobRunner实用程序运行该作业(使用maven shade插件生成的胖jar依赖项);由于“达到了java堆内存限制”,作业随后中途失败,并且作业未标记为FAILED,而是仍显示STARTED状态 .

我尝试使用相同的作业参数重新运行作业(如文档所示),但这给了我这个错误:

5:24:34.147 [main] ERROR o.s.b.c.l.s.CommandLineJobRunner - Job Terminated in error: A job execution for this job is already running: JobInstance: id=1, version=0, Job=[maskTableJob]

org.springframework.batch.core.repository.JobExecutionAlreadyRunningException:此作业的作业执行已在运行:org.springframework.batch.core.repository.support中的JobInstance:id = 1,version = 0,Job = [maskTableJob] . SimpleJobRepository.createJobExecution(SimpleJobRepository.java:120)〜[maskng-batch-1.0-SNAPSHOT-executable.jar:1.0-SNAPSH

我尝试了各种各样的事情(比如使用-restart参数手动将状态设置为FAILED),但无济于事 . 我在这里缺少一些东西,因为我认为 Spring 季批次的一个优点是能够在他们离开的地方重新开始工作.... !!

回答(1)

2 years ago

您应该知道的第一件事是Joblauncher不能用于重新启动已经运行的作业 . 您收到“JobExecutionAlreadyRunningException”的原因是因为您传递的参数已经存在于DB中,因此您将收到此异常 .

在 Spring 季批次中,如果作业已完成“FAILED”状态或“STOPPED”状态,则可以重新启动作业 .

JobOperator 具有重新启动方法,该方法可用于通过传递以"FAILED" status或"STOPPED" status完成的jobexecution id来重新启动失败的作业 .

请注意,如果作业已完成“已完成”状态,则无法重新启动作业 . 在这种情况下,您将必须使用新的作业参数提交新作业

如果要手动将作业状态设置为失败,请运行以下查询并使用JobOperator.restart()方法重新启动作业 .

update batch_job_execution set status="FAILED", version=version+1 where job_instance_id=jobId;

处理事务管理不当可能是您的工作状态未以“FAILED”状态更新的一个可能原因 . 即使作业遇到运行时异常,也请确保您的事务已完成 .