【问题标题】:SpringBatch - Step no longer executing: Step already complete or not restartableSpring Batch - 步骤不再执行:步骤已完成或不可重新启动
【发布时间】: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


【解决方案1】:

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

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

我真的解决了这个问题,感谢 Hassine 先生,他多次回复并指出我正确的方向。他在第一次回复中提供的链接中确实提到了未来预防的解决方案:Spring Batch error (A Job Instance Already Exists) and RunIdIncrementer generates only once

【讨论】:

  • 很高兴听到您解决了问题。总是乐于提供帮助!
猜你喜欢
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 2018-09-27
  • 2023-02-10
  • 2022-01-07
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多