【问题标题】:Restarting chunk job execution with Spring Batch Integration使用 Spring Batch Integration 重新启动块作业执行
【发布时间】:2021-02-12 23:03:03
【问题描述】:

我正在使用 Spring Batch Integration 将文件从存储桶复制到本地目录并启动读取这些文件的作业。

我按照这个教程Transforming File Into a JobLaunchRequest

如果在处理过程中发生异常也没关系,作业被标记为 FAILED,当我再次启动项目时,作业重新启动。

但是我尝试了一个危急的情况,当服务器在读取过程中宕机。

当我重新开始时,我收到了以下异常:

Caused by: org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobExecution: id=1, version=1, startTime=2021-02-12 19:47:47.0, endTime=null, lastUpdated=2021-02-12 19:47:47.0, status=STARTED, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=1, version=0, Job=[receivablePositionJob]], jobParameters=[{input.file.name

我验证了重新启动作业背后的逻辑,问题是该步骤被标记为 STARTED 而没有 END_TIME。我当然知道这是正确的行为。

有什么方法可以解决这个问题,我强制执行该作业吗?

【问题讨论】:

  • 您的问题与 Spring 集成无关:工作状态及其管理显然是 Spring Batch 问题。为问题选择标签时请小心
  • @ArtemBilan 或多或少...正如我所说,这是 Spring Batch 的正常行为,我问的是是否有办法在集成启动工作之前,我可以处理,发现是否工作已经存在,他们的状态和决定我想做什么......

标签: spring-batch


【解决方案1】:

您需要将作业/步骤执行状态更新为FAILED,并将结束时间更新为非空值。这是一个简单的例子:

> update BATCH_JOB_EXECUTION set status = 'FAILED', END_TIME = '2020-01-15 10:10:28.235' where job_execution_id = X;
> update BATCH_STEP_EXECUTION set status = 'FAILED' where job_execution_id = X and step_name='failed step name';

SQL 语法可能因您的数据库服务器而异。有了这个,你应该可以重新开始执行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2015-06-10
    • 2017-04-29
    • 1970-01-01
    • 2019-01-05
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多