无法重新启动通过操作系统终止的Spring批处理作业

无法重新启动通过操作系统终止的Spring批处理作业,spring,spring-batch,Spring,Spring Batch,我正在测试Spring批处理重新启动功能,在该功能中,我希望在执行之间手动终止的作业在提供作业执行ID时重新启动 我更新了BATCH_JOB_EXECUTION和BATCH_STEP_EXECUTION表,使其状态和退出代码为“FAILED”。但是,当我试图通过提供执行ID来重新启动作业时,出现了如下异常- 2020-06-25 21:00:16,068 ERROR [main] j.c.r.r.m.r.s.b.BatchAppRunner - Illegal state (only happe

我正在测试Spring批处理重新启动功能,在该功能中,我希望在执行之间手动终止的作业在提供作业执行ID时重新启动

我更新了BATCH_JOB_EXECUTION和BATCH_STEP_EXECUTION表,使其状态和退出代码为“FAILED”。但是,当我试图通过提供执行ID来重新启动作业时,出现了如下异常-

2020-06-25 21:00:16,068 ERROR [main] j.c.r.r.m.r.s.b.BatchAppRunner - Illegal state (only happens on a race condition): job execution already running with name=DealItemsExportJob and parameters={RUN_ID=SDB_20200625202925}
org.springframework.batch.core.UnexpectedJobExecutionException: Illegal state (only happens on a race condition): job execution already running with name=DealItemsExportJob and parameters={RUN_ID=SDB_20200625202925}
    at org.springframework.batch.core.launch.support.SimpleJobOperator.restart(SimpleJobOperator.java:283)
    at org.springframework.batch.core.launch.support.SimpleJobOperator$$FastClassBySpringCGLIB$$44ee6049.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685)
    at org.springframework.batch.core.launch.support.SimpleJobOperator$$EnhancerBySpringCGLIB$$5bba10fb.restart(<generated>)
    at jp.co.rakuten.rms.mall.rsf.superdeal.batch.controller.JobRestartController.doController(JobRestartController.java:36)
    at jp.co.rakuten.rms.mall.rsf.superdeal.batch.BatchAppRunner.main(BatchAppRunner.java:42)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Caused by: org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobInstance: id=24, version=0, Job=[DealItemsExportJob]
    at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:121)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:353)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean$1.invoke(AbstractJobRepositoryFactoryBean.java:181)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy43.createJobExecution(Unknown Source)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:137)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy47.run(Unknown Source)
    at org.springframework.batch.core.launch.support.SimpleJobOperator.restart(SimpleJobOperator.java:280)
    ... 14 common frames omitted
2020-06-25 21:00:16068错误[main]j.c.r.r.m.r.s.b.BatchAppRunner-非法状态(仅在竞争条件下发生):作业执行已在运行,名称=DealItemsExportJob,参数={RUN_ID=SDB_20200625202925}
org.springframework.batch.core.UnexpectedJobExecutionException:非法状态(仅在竞争条件下发生):作业执行已在运行,名称为DealItemsExportJob,参数为{RUN_ID=SDB_20200625202925}
位于org.springframework.batch.core.launch.support.SimpleJobOperator.restart(SimpleJobOperator.java:283)
位于org.springframework.batch.core.launch.support.SimpleJoboOperator$$FastClassBySpringCGLIB$$44ee6049.invoke()
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685)
位于org.springframework.batch.core.launch.support.SimpleJoboOperator$$EnhancerBySpringCGLIB$$5bba10fb.restart()
位于jp.co.rakuten.rms.mall.rsf.superdeal.batch.controller.jobretartcontroller.doController(jobretartcontroller.java:36)
位于jp.co.rakuten.rms.mall.rsf.superdeal.batch.BatchAppRunner.main(BatchAppRunner.java:42)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:566)
位于org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
位于org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
位于org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
位于org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
原因:org.springframework.batch.core.repository.JobExecutionReadyRunningException:此作业的作业执行已在运行:JobInstance:id=24,版本=0,作业=[DealItemsExportJob]
位于org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:121)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:566)
位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:163)上
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:353)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean$1.invoke(AbstractJobRepositoryFactoryBean.java:181)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
位于com.sun.proxy.$Proxy43.createJobExecution(未知源)
位于org.springframework.batch.core.launch.support.simplejoblancher.run(simplejoblancher.java:137)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:566)
位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:163)上
位于org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
位于com.sun.proxy.$Proxy47.run(未知源)
位于org.springframework.batch.core.launch.support.SimpleJobOperator.restart(SimpleJobOperator.java:280)
... 省略14个公共框架

有人能建议我在这里犯了什么错误吗?

对于失败的作业/步骤,您还需要在批处理作业执行和批处理步骤执行中将结束时间更新为非空值 处决