无法重新启动 Spring 批处理作业
Unable to restart a Spring batch job
我有一个 spring 批处理作业,可以读取、转换和写入 Oracle 数据库。我正在 运行 通过 CommandLineJobRunner 实用程序(使用 fat jar + 由 maven shade 插件生成的依赖项)执行作业;该作业随后由于 "java heap memory limit reached" 而中途失败,并且该作业未标记为失败但仍显示状态已启动。
我尝试使用相同的作业参数(如文档建议的那样)重新运行作业,但这给了我这个错误:
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:此作业的作业执行已经 运行ning: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
我尝试了各种方法(比如手动将状态设置为 FAILED,使用 -restart 参数)但无济于事。我认为 spring 批处理的强项之一是它能够在他们停止的地方重新启动作业的能力……!!?
您应该知道的第一件事是 Joblauncher 不能用于重新启动已经 运行 的作业。
你得到 "JobExecutionAlreadyRunningException" 的原因是因为你传递的参数已经存在于数据库中,因此你得到这个异常。
在 spring 批处理中,如果作业以 "FAILED" 状态或 "STOPPED" 状态完成,则可以重新启动作业。
JobOperator 具有重启方法,可用于通过传递以 "FAILED" 状态或 "STOPPED" 状态完成的作业执行 ID 来重启失败的作业.
请注意,如果作业已完成且状态为 "FINISHED",则无法重新启动该作业。
在这种情况下,您将必须提交具有新作业参数的新作业
如果您想手动将作业状态设置为失败,那么 运行 下面的查询并使用 JobOperator.restart() 方法重新启动作业。
update batch_job_execution set status="FAILED", version=version+1 where job_instance_id=jobId;
事务管理处理不当可能是您的作业状态未更新为 "FAILED" 状态的一个可能原因。请确保您的交易正在完成,即使作业遇到 运行 时间异常。
我有一个 spring 批处理作业,可以读取、转换和写入 Oracle 数据库。我正在 运行 通过 CommandLineJobRunner 实用程序(使用 fat jar + 由 maven shade 插件生成的依赖项)执行作业;该作业随后由于 "java heap memory limit reached" 而中途失败,并且该作业未标记为失败但仍显示状态已启动。
我尝试使用相同的作业参数(如文档建议的那样)重新运行作业,但这给了我这个错误:
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:此作业的作业执行已经 运行ning: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
我尝试了各种方法(比如手动将状态设置为 FAILED,使用 -restart 参数)但无济于事。我认为 spring 批处理的强项之一是它能够在他们停止的地方重新启动作业的能力……!!?
您应该知道的第一件事是 Joblauncher 不能用于重新启动已经 运行 的作业。 你得到 "JobExecutionAlreadyRunningException" 的原因是因为你传递的参数已经存在于数据库中,因此你得到这个异常。
在 spring 批处理中,如果作业以 "FAILED" 状态或 "STOPPED" 状态完成,则可以重新启动作业。
JobOperator 具有重启方法,可用于通过传递以 "FAILED" 状态或 "STOPPED" 状态完成的作业执行 ID 来重启失败的作业.
请注意,如果作业已完成且状态为 "FINISHED",则无法重新启动该作业。 在这种情况下,您将必须提交具有新作业参数的新作业
如果您想手动将作业状态设置为失败,那么 运行 下面的查询并使用 JobOperator.restart() 方法重新启动作业。
update batch_job_execution set status="FAILED", version=version+1 where job_instance_id=jobId;
事务管理处理不当可能是您的作业状态未更新为 "FAILED" 状态的一个可能原因。请确保您的交易正在完成,即使作业遇到 运行 时间异常。