我有一个弹出批处理作业,可以读取,转换和写入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:此作业的作业执行已在运行:JobInstance:id = 1,version = 0,Job = [maskTableJob] 在org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:120)〜[maskng-batch-1.0-SNAPSHOT-executable.jar:1.0-SNAPSH
我尝试了各种各样的事情(比如使用-restart参数手动将状态设置为FAILED),但无济于事。我在这里缺少什么,因为我认为春季批次的一个优点是它能够在他们离开的地方重新开始工作...... !!
答案 0 :(得分:3)
您应该知道的第一件事是Joblauncher不能用于重新启动已经运行的作业。 您收到“JobExecutionAlreadyRunningException”的原因是因为您传递的参数已经存在于数据库中,因此您将收到此异常。
在春季批次中,如果作业已完成“FAILED”状态或“STOPPED”状态,则可以重新开始作业。
JobOperator 具有重启方法,该方法可用于通过传递已完成“FAILED”状态或“已停止”状态的作业执行ID来重新启动失败的作业。
请注意,如果作业已完成“已完成”状态,则无法重新启动作业。 在这种情况下,您将不得不提交具有新工作参数的新工作
如果要手动将作业状态设置为失败,请运行以下查询并使用JobOperator.restart()方法重新启动作业。
update batch_job_execution set status="FAILED", version=version+1 where job_instance_id=jobId;
不正确的交易管理处理可能是您的工作状态未以“FAILED”状态更新的一个可能原因。即使作业遇到运行时异常,也请确保您的事务已完成。