【问题标题】:Spring Batch Partitioning, how to stop a Job once any of the partitioned step throws exceptionSpring Batch Partitioning,一旦任何分区步骤引发异常,如何停止作业
【发布时间】:2016-05-10 21:31:28
【问题描述】:

我正在运行带有分区步骤的 Spring Batch 作业,如果其中 1 个分区失败或引发异常,我需要立即停止作业,一旦任何分区步骤引发异常,如何停止作业,就像当前其他分区步骤一样继续运行直到结束,完成后,作业停止并返回不成功的代码。

代码 ::stepBuilderFactory.get("masterStep").allowStartIfComplete(true).partitioner(multithreadedPartitionerStep) .partitioner("multithreadedPartitionerStep", extractJobPartitioner).gridSize(gridSize) .taskExecutor(taskExecutor).build();

【问题讨论】:

  • 你使用的是Spring提供的TaskExecutorPartitionHandler吗?如果不是,我认为您需要在 PartitionHandler 实现中自己提供逻辑。
  • @JimGarrison 我目前正在使用 SimpleAsyncTaskExecutor。
  • 不要在 cmets 中发布代码,而是更新您的问题。

标签: java spring spring-batch


【解决方案1】:

如果我理解正确,您希望 Spring Batch Job 根据您的步骤输出实现某种行为。

正如上面提到的@Jim,向我们展示您的分区处理程序。

第一件事 - 工作就是工作。它由步骤组成(分区可能)。如果任何步骤的状态过时,它也会反映在 Job 上(一般而言)

另外,我猜您现在可能已经迁移到更新版本的 Spring Batch。幸运的是,在 4.x 世界中,除了常规流程之外,您还有三种选择。

  1. 在一步结束
  2. 步骤失败
  3. 在给定步骤停止作业

参考链接 - Spring Guides

然后你告诉 Spring Batch 在什么时候做什么。以下是上述链接的快速浏览:

@Bean
public Job job() {
        return this.jobBuilderFactory.get("job")
                                .start(step1())
                                .next(step2())
                                .on("FAILED").end()
                                .from(step2()).on("*").to(step3())
                                .end()
                                .build();
}

在以下场景中,如果 step2 失败,则 Job 将停止,BatchStatus 为 FAILED/COMPLETE/WHATEVER,ExitStatus 为 EARLY TERMINATION,并且 step3 不会执行。否则,执行移至步骤 3。此外,如果 step2 失败并重新启动 Job,则在 step2 再次开始执行。

@Bean
public Job job() {
        return this.jobBuilderFactory.get("job")
                        .start(step1())
                        .next(step2()).on("FAILED").fail()
                        .from(step2()).on("*").to(step3())
                        .end()
                        .build();
}

还有

在以下场景中,如果 step1 以 COMPLETE/FAILED/WHATEVER 结束,则作业停止。重新启动后,从第 2 步开始执行。

@Bean
public Job job() {
        return this.jobBuilderFactory.get("job")
                        .start(step1()).on("COMPLETED").stopAndRestart(step2())
                        .end()
                        .build();
}

this分区步骤中,如果在任何csv中发现任何不正确数量的字段,则报告正确。这里asynctaskexecutor和threadpooltaskexecutor用于partitioned step。

希望它能有所帮助并以某种方式适合您的场景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多