Spring Batch Partitioning,如果任何分区步骤抛出异常,如何停止作业

我正在使用分区步骤运行Spring批处理作业,如果1分区失败或抛出异常我需要立即停止作业,如果任何分区步骤抛出异常,如何停止作业,因为当前其他分区步骤一直运行直到结束,完成后,作业将以不成功的返回码停止 .

Code :: stepBuilderFactory.get(“masterStep”) . allowStartIfComplete(true).partitioner(multithreadedPartitionerStep).partitioner(“multithreadedPartitionerStep”,extractJobPartitioner).gridSize(gridSize).taskExecutor(taskExecutor).build();

回答(1)

2 years ago

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

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

第一件事 - 工作是一份工作 . 它由步骤组成(可以是分区的) . 如果任何一个步骤的状态变得陈旧,它也将反映在Job上(通用术语)

到目前为止,你可能已经转移到了更新版本的Spring Batch . 幸运的是,在4.x世界中,除常规流量外,您还有三种选择 .

  • 结束一步

  • 失败了一步

  • 在给定步骤停止工作

参考链接 - 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失败,则作业将以BatchStatus为FAILED / COMPLETE / WHATEVER并且ExitStatus为EARLY TERMINATION而停止,并且step3不会执行 . 否则,执行转到步骤3 . 此外,如果step2失败并重新启动作业,则在步骤2再次开始执行 .

@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用于分区步骤 .

希望它有所帮助,以某种方式适合您的情况 .