SpringBatch - 步骤不再执行:步骤已完成或不可重新启动

Tim*_*thy 11 java spring spring-batch spring-boot

我有一个单步 springbatch 应用程序。工作内容如下:

@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
                             JobBuilderFactory jobBuilderFactory) {
    return jobBuilderFactory.get("databaseCursorJob")
            .incrementer(new RunIdIncrementer())
            .flow(exampleJobStep)
            .end()
            .build();
}
Run Code Online (Sandbox Code Playgroud)

我从 springboot 应用程序开始这项工作。今天下午,我尝试在工作中添加第二步。大致如下:

@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
                             JobBuilderFactory jobBuilderFactory) {
    return jobBuilderFactory.get("databaseCursorJob")
            .incrementer(new RunIdIncrementer())
            .flow(exampleJobStep).next(partitionStep())
            .end()
            .build();
}
Run Code Online (Sandbox Code Playgroud)

换句话说,只需添加“next(partitionStep())”。但是,自从我这样做以来,作业就完成了,而没有执行任何步骤(请参见下面的 shell 输出)。事实上,即使在删除第二步并返回到原来的作业,它拒绝执行该步骤。在尝试添加第二步之前,我从未遇到过这个问题。我什至重新启动了我的虚拟机,它仍然跳过该步骤。我已经死在水里了,直到我解决了这个问题。感谢任何见解。谢谢。

2020-09-01 14:49:00.260  INFO 6913 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8087 (http) with context path ''
2020-09-01 14:49:00.263  INFO 6913 --- [           main] f.p.r.Application    : Started Application in 7.752 seconds (JVM running for 9.092)
2020-09-01 14:49:00.268  INFO 6913 --- [           main] o.s.b.a.b.JobLauncherCommandLineRunner   : Running default command line with: []
2020-09-01 14:49:00.579  INFO 6913 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [FlowJob: [name=databaseCursorJob]] launched with the following parameters: [{}]
2020-09-01 14:49:00.698  INFO 6913 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Step already complete or not restartable, so no action to execute: StepExecution: id=120, version=4, name=databaseCursorStep, status=COMPLETED, exitStatus=COMPLETED, readCount=1, filterCount=0, writeCount=1 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=2, rollbackCount=0, exitDescription=
2020-09-01 14:49:00.730  INFO 6913 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [FlowJob: [name=databaseCursorJob]] completed with the following parameters: [{}] and the following status: [COMPLETED]
Run Code Online (Sandbox Code Playgroud)

Tim*_*thy 7

我的问题是,如果出现错误或陷入未知状态,我的工作将无法恢复。该步骤不是“已经完成”,而是从未完成。它的状态仍然是“已启动”,退出代码为“未知”,因为它从未退出。不管怎样,我的作业存储库不在内存中,而是捕获到本地数据库中,这就是为什么即使在重新启动虚拟机后它也从未自行解决(为我不记得这一点而感到羞耻)。因此,我能够通过清除作业实例历史记录来解决这个问题,但这只是一个创可贴。我仍然需要修复我的代码以防止它再次发生。

我还了解到我可以通过检查数据库中的作业存储库(全部都在那里)来进行诊断。

我真的解决了这个问题,感谢哈辛先生,他在上面多次回复并为我指明了正确的方向。他在第一个回复中提供的链接中确实解决了将来防止的解决方案:Spring Batch error (A Job Instance Already Exists) and RunIdIncrementer 仅生成一次