【发布时间】:2020-12-20 22:38:45
【问题描述】:
我有一个单步 springbatch 应用程序。工作如下:
@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
JobBuilderFactory jobBuilderFactory) {
return jobBuilderFactory.get("databaseCursorJob")
.incrementer(new RunIdIncrementer())
.flow(exampleJobStep)
.end()
.build();
}
我从 springboot 应用程序开始工作。今天下午,我试图在工作中添加第二步。大致如下:
@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]
【问题讨论】:
-
@MahmoudBenHassine 。谢谢你的建议。我认为这是不同的(但我可能是错的)。为什么重启VM后问题不会消失?我认为重新启动VM后会重置jobID。每次重新启动VM后它不应该至少工作一次吗?
-
您使用的是持久作业存储库还是内存中的作业存储库?您没有传递任何作业参数,因此一组空参数的哈希值将是相同的,并且您每次都在同一个作业实例上。重复问题中的答案建议要么添加一个参数作为作业实例之间的鉴别器,要么在步骤上设置
allowStartIfComplete=true。他们都应该解决你的问题。 -
嗨@MahmoudBenHassine 你是绝对正确的,你上面提出的问题回答了我的问题。我确实有一个本地 H2 数据库用于作业存储库,您的见解为我解决了这个问题。在短期内,我已经清除了 H2 DB 中的作业实例信息(实际上,我创建了一个新的 H2 DB,因为我认为这样会更干净)。但是你已经帮我解决了我眼前的问题。我不知道如何给你的功劳并将帖子“解决”。
-
@MahmoudBenHassine 从长远来看,我需要使用您上面提出的解决方案。我正在采取使用区分作业参数(如时间戳)的方法来防止这种情况在未来发生。但是,我当前的工作启动设置转换为传递工作参数时遇到问题。但是,我认为这是一篇新文章,而不是添加到这篇文章中。
标签: java spring spring-boot spring-batch