Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBatch-步骤不再执行:步骤已完成或无法重新启动_Java_Spring_Spring Boot_Spring Batch - Fatal编程技术网

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

Java SpringBatch-步骤不再执行:步骤已完成或无法重新启动,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,我有一个单步springbatch应用程序。工作内容如下: @Bean public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep, JobBuilderFactory jobBuilderFactory) { return jobBuilderFactory.get("databaseCursor

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

@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
                             JobBuilderFactory jobBuilderFactory) {
    return jobBuilderFactory.get("databaseCursorJob")
            .incrementer(new RunIdIncrementer())
            .flow(exampleJobStep)
            .end()
            .build();
}
@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
                             JobBuilderFactory jobBuilderFactory) {
    return jobBuilderFactory.get("databaseCursorJob")
            .incrementer(new RunIdIncrementer())
            .flow(exampleJobStep).next(partitionStep())
            .end()
            .build();
}
我从springboot应用程序开始工作。今天下午,我试图为这份工作增加第二步。基本上如下:

@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
                             JobBuilderFactory jobBuilderFactory) {
    return jobBuilderFactory.get("databaseCursorJob")
            .incrementer(new RunIdIncrementer())
            .flow(exampleJobStep)
            .end()
            .build();
}
@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
                             JobBuilderFactory jobBuilderFactory) {
    return jobBuilderFactory.get("databaseCursorJob")
            .incrementer(new RunIdIncrementer())
            .flow(exampleJobStep).next(partitionStep())
            .end()
            .build();
}
换句话说,只需添加“next(partitionStep())。但是,自从我这样做之后,作业就完成了,没有执行任何步骤(请参见下面的shell输出)。事实上,即使在删除第二步并返回到原始作业后,它仍拒绝执行该步骤。在尝试添加第二步之前,我从未遇到过此问题。我甚至重新启动了VM,但它仍然跳过了该步骤。在解决此问题之前,我已经陷入了困境。感谢您提供的任何见解。谢谢美国

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]

我的问题是,如果出现错误或卡在未知状态,我的作业无法恢复。该步骤不是“已完成”,它从未完成。其状态仍然为“已启动”,退出代码为“未知”“因为它从未退出过。无论如何,我的作业存储库不在内存中,而是被捕获到一个本地数据库中,这就是为什么即使在重启VM后它也无法自行解析的原因(为我没有记住这一点而感到羞耻)。所以,我可以通过清除工作实例历史来修复,但那是一个创可贴。我仍然需要修复代码以防止再次发生

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


我真的解决了这个问题,感谢哈辛先生,他在上面多次作出回应,为我指明了正确的方向。他在第一次回复中提供的链接中确实提到了未来预防的解决方案:

我的问题是,如果出现错误或处于未知状态,我的工作将无法恢复。该步骤不是“已经完成”,它从未完成。其状态仍为“已启动”,退出代码为“未知”,因为它从未退出。无论如何,我的作业存储库不在内存中,而是被捕获到一个本地数据库中,这就是为什么即使在重启VM后它也无法自行解析的原因(为我没有记住这一点而感到羞耻)。所以,我可以通过清除工作实例历史来修复,但那是一个创可贴。我仍然需要修复代码以防止再次发生

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


我真的解决了这个问题,感谢哈辛先生,他在上面多次作出回应,为我指明了正确的方向。他在第一次回复中提供的链接中确实提到了未来预防的解决方案:

这是否回答了您的问题@马哈茂德本哈辛。谢谢你的建议。我认为这是不同的(但我可能错了)。为什么重启VM后问题不会消失?我认为重新启动VM后,jobIDs会被重置。它是否应该在每次重启VM后至少工作一次?您使用的是持久性作业存储库还是内存中的作业存储库?您没有传递任何作业参数,因此空参数集的散列将是相同的,并且每次都会在相同的作业实例上结束。重复问题中的答案建议在作业实例之间添加一个参数作为鉴别器,或者在步骤上设置
allowstartificomplete=true
。他们都应该解决你的问题。嗨@MahmoudBenHassine你完全正确,你上面提出的问题回答了我的问题。我确实有一个本地的H2数据库,我正在使用它作为工作存储库,您的见解为我澄清了这个问题。在短期内,我已经删除了H2DB中的作业实例信息(实际上,我创建了一个新的H2DB,因为我认为这样会更干净)。但你已经帮我解决了眼前的问题。我不知道如何才能给你这个荣誉,并将帖子改为“已解决”。@MahmoudBenHassine从长远来看,我需要使用你上面介绍的解决方案。我采取的方法是使用有区别的作业参数(比如时间戳)来防止将来发生这种情况。但是,我对当前的作业启动设置有问题,无法转换为传递作业参数。然而,我认为这是一个新的职位,而不是增加到这个。这是否回答了你的问题@马哈茂德本哈辛。谢谢你的建议。我认为这是不同的(但我可能错了)。为什么重启VM后问题不会消失?我认为重新启动VM后,jobIDs会被重置。它是否应该在每次重启VM后至少工作一次?您使用的是持久性作业存储库还是内存中的作业存储库?您没有传递任何作业参数,因此空参数集的散列将是相同的,并且每次都会在相同的作业实例上结束。重复问题中的答案建议在作业实例之间添加一个参数作为鉴别器,或者在步骤上设置
allowstartificomplete=true
。他们都应该解决你的问题。嗨@MahmoudBenHassine你完全正确,你上面提出的问题回答了我的问题。我确实有一个本地的H2数据库,我正在使用它作为工作存储库,您的见解为我澄清了这个问题。在短期内,我已经删除了H2DB中的作业实例信息(实际上,我创建了一个新的H2DB,因为我认为这样会更干净)。但你已经帮我解决了眼前的问题。我不知道如何才能给你这个荣誉,并将帖子改为“已解决”。@MahmoudBenHassine从长远来看,我需要使用你上面介绍的解决方案。我采取的方法是使用有区别的作业参数(比如时间戳)来防止将来发生这种情况。但是,我对当前的作业启动设置有问题,无法转换为传递作业参数。然而,我认为这是一个新的职位,而不是增加到这个。很高兴听到你解决了你的问题。总是乐于助人!很高兴听到你解决了你的问题。总是乐于助人!