batch spring 重复执行_Spring Batch从相同的执行和步骤重新启动未完成的作业

我使用以下逻辑重新启动未完成的Spring Batch(例如,在应用程序异常终止之后)作业:

public void restartUncompletedJobs() {

LOGGER.info("Restarting uncompleted jobs");

try {

jobRegistry.register(new ReferenceJobFactory(documetPipelineJob));

List jobs = jobExplorer.getJobNames();

for (String job : jobs) {

Set runningJobs = jobExplorer.findRunningJobExecutions(job);

for (JobExecution runningJob : runningJobs) {

runningJob.setStatus(BatchStatus.FAILED);

runningJob.setEndTime(new Date());

jobRepository.update(runningJob);

jobOperator.restart(runningJob.getId());

LOGGER.info("Job restarted: " + runningJob);

}

}

} catch (Exception e) {

LOGGER.error(e.getMessage(), e);

}

}

这可以正常工作,但有一个副作用-它不会重新启动失败的作业执行,而是创建一个新的执行实例。如何更改此逻辑以便从失败的步骤重新启动失败的执行并且不创建新的执行?

更新

当我尝试以下代码时:

public void restartUncompletedJobs() {

try {

jobRegistry.register(new ReferenceJobFactory(documetPipelineJob));

List jobs = jobExplorer.getJobNames();

for (String job : jobs) {

Set jobExecutions = jobExplorer.findRunningJobExecutions(job);

for (JobExecution jobExecution : jobExecutions) {

jobOperator.restart(jobExecution.getId());

}

}

} catch (Exception e) {

LOGGER.error(e.getMessage(), e);

}

}

它失败,但以下异常:

2018-07-30 06:50:47.090 ERROR 1588 --- [ main] c.v.p.d.service.batch.BatchServiceImpl : Illegal state (only happens on a race condition): job execution already running with name=documetPipelineJob and parameters={ID=826407fa-d3bc-481a-8acb-b9643b849035, inputDir=/home/public/images, STORAGE_TYPE=LOCAL}

org.springframework.batch.core.UnexpectedJobExecutionException: Illegal state (only happens on a race condition): job execution already running with name=documetPipelineJob and parameters={ID=826407fa-d3bc-481a-8acb-b9643b849035, inputDir=/home/public/images, STORAGE_TYPE=LOCAL}

at org.springframework.batch.core.launch.support.SimpleJobOperator.restart(SimpleJobOperator.java:283) ~[spring-batch-core-4.0.1.RELEASE.jar!/:4.0.1.RELEASE]

at org.springframework.batch.core.launch.support.SimpleJobOperator$$FastClassBySpringCGLIB$$44ee6049.invoke() ~[spring-batch-core-4.0.1.RELEASE.jar!/:4.0.1.RELEASE]

at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) [spring-core-5.0.6.RELEASE.jar!/:5.0.6.RELEASE]

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684) [spring-aop-5.0.6.RELEASE.jar!/:5.0.6.RELEASE]

at org.springframework.batch.core.launch.support.SimpleJobOperator$$EnhancerBySpringCGLIB$$7659d4c.restart() ~[spring-batch-core-4.0.1.RELEASE.jar!/:4.0.1.RELEASE]

at com.example.pipeline.domain.service.batch.BatchServiceImpl.restartUncompletedJobs(BatchServiceImpl.java:143) ~[domain-0.0.1.jar!/:0.0.1]

以下代码在作业存储数据库中创建新的执行:

public void restartUncompletedJobs() {

try {

jobRegistry.register(new ReferenceJobFactory(documetPipelineJob));

List jobs = jobExplorer.getJobNames();

for (String job : jobs) {

Set jobExecutions = jobExplorer.findRunningJobExecutions(job);

for (JobExecution jobExecution : jobExecutions) {

jobExecution.setStatus(BatchStatus.STOPPED);

jobExecution.setEndTime(new Date());

jobRepository.update(jobExecution);

Long jobExecutionId = jobExecution.getId();

jobOperator.restart(jobExecutionId);

}

}

} catch (Exception e) {

LOGGER.error(e.getMessage(), e);

}

}

问题是-如何在应用程序重启后如何继续运行旧的未完成的执行而又不创建新的执行?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值