当前位置: 首页 > 知识库问答 >
问题:

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

云锦
2023-03-14

我正在运行一个带有分区步骤的Spring批处理作业,如果其中一个分区失败或抛出异常,我需要立即停止作业,如何停止作业,一旦任何一个分区步骤抛出异常,因为目前其他分区步骤一直运行到结束,在它们完成后,作业停止,返回代码不成功。

代码::stepBuilderFactory.get(“masterStep”).AllowStartifComplete(true).Partitioner(multithreadedPartitionerStep).Partitioner(“multithreadedPartitionerStep”,extractJobPartitioner).gridSize(gridSize).taskExecutor(taskExecutor).build();

共有1个答案

荆弘伟
2023-03-14

如果我理解正确的话,您希望Spring批处理作业根据您的步骤输出实现某种行为。

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

第一件事第一份工作就是一份工作。它由步骤组成(分区的可能是)。如果步骤的任何状态变得陈旧,它也会反映在作业上(用一般术语来说)

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

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

参考连杆Spring导轨

@Bean
public Job job() {
        return this.jobBuilderFactory.get("job")
                                .start(step1())
                                .next(step2())
                                .on("FAILED").end()
                                .from(step2()).on("*").to(step3())
                                .end()
                                .build();
}
@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/whather结束,那么作业将停止。一旦重新启动,执行将在步骤2开始。

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

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

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

 类似资料:
  • 当生成消息到Kafka时,您可以得到两种错误:可检索和不可检索。在处理它们时,你应该如何区分它们? 我希望异步生成记录,将接收到不可重试异常的记录保存在另一个主题(或HBase)中,并让生产者为我处理所有接收到可重试异常的记录(最多尝试次数,当它最终到达时,会成为第一批异常之一)。 我的问题是:尽管有,但生产者是否仍会自行处理可检索的异常?因为在接口回调中说: 可重试异常(暂时的,可通过增加#.重

  • 我们使用的是partitioner,它用@Scope(value=“step”)注释,还有setter方法,用@beforstep注释,但framewowrk仍然没有注入step执行对象? 我们做错了什么

  • 我有一个异步函数,我希望在失败时抛出异常。然而,似乎有一些东西阻止了这一点: 通过省略try catch块,我希望抛出一个异常,我想在函数外部处理这个异常。 我得到的实际结果有点令人困惑: 当我尝试捕获异常并抛出其他东西时,会得到相同的结果: 该函数是从try块调用的,因此看不到这如何是未处理的promise。 我正在尝试使用< code>f作为另一个函数的参数:

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 假设我正在从S3文件夹中读取100个文件。每个文件的大小为10 MB。当我执行<code>df=spark.read时。parquet(s3路径),文件(或更确切地说分区)如何在任务之间分布?E、 g.在这种情况下,<code>df</code>将有100个分区,如果spark有10个任务正在运行以将该文件夹的内容读取到数据帧中,那么这些分区是如何分配给这10个任务的?它是以循环方式进行的,还是每

  • 我知道JVM有一个异常表,它映射在给定字节码索引中可以抛出的可能异常。我还读到athrow字节码抛出了堆栈顶部存在的引用类型的exception。我的问题更多地涉及像irem这样的指令如何“抛出”异常。 JVM是否会在每次指令执行后检查堆栈的顶部,以检查是否存在异常?如果你能洞察到这件事的话,你会很感激的。