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

Spring batch:在分区步骤中遇到传播异常(停止作业执行)

唐渊
2023-03-14

背景

问题所在

如果在读取任何物理分区时出现任何问题,则该从步骤的执行将失败,异常将由spring Batch记录下来。这不会影响读取文件不同物理分区的其余从步骤的执行;然而,这并不是人们想要的行为。我想要的是,如果在读取特定物理分区时出现问题(例如:无法解析特定列),则应该将异常传播到作业启动的位置,以便停止任何进一步的处理。

AbstractStep中execute方法的当前实现捕获Throwable并通过记录异常来抑制异常。因此,异常不会传播到作业启动的位置,并且无法停止其余从步骤的执行。

如何使spring-batch将从步骤中发生的任何异常传播到启动作业的位置?我希望这样做,以便在处理任何分区文件时出现问题时,可以停止任何进一步的处理。

共有1个答案

蓬思博
2023-03-14

如果在读取任何物理分区时出现任何问题,则该从步骤的执行将失败,异常将由spring Batch记录下来。这不会影响读取文件不同物理分区的其余从步骤的执行;然而,这并不是人们想要的行为。

我认为,“这不会影响剩余从步骤的执行”这一事实是期望的行为。通常,将一大块工作划分为并行执行的较小任务背后的思想是,任务应该相互独立,一个失败不应该影响其他失败。如果存在要求一个任务失败才能停止其他任务的逻辑,这意味着任务没有被很好地定义为独立的,在本地/远程分区步骤中执行它们首先不是合适的选择。

我想要的是,如果在读取特定物理分区时出现问题(例如:无法解析特定列),则应将异常传播到启动作业的位置,以便停止任何进一步的处理。

为此需要自定义PartitionHandler。这是协调工人步骤的部分。默认行为是等待所有员工步骤完成并汇总结果,然后向主作业报告。您的自定义实现应该检测到任何辅助步骤的失败,并通知其他步骤停止。

而且,这种如果其中一个工人失败就停止/失败所有工人的设计不适用于作业重启。这意味着重新启动作业将重新启动所有分区,这并不是分区作业的首要目标,因为只有失败的分区才应该重新启动。

 类似资料:
  • 我正在运行一个带有分区步骤的Spring批处理作业,如果其中一个分区失败或抛出异常,我需要立即停止作业,如何停止作业,一旦任何一个分区步骤抛出异常,因为目前其他分区步骤一直运行到结束,在它们完成后,作业停止,返回代码不成功。 代码::stepBuilderFactory.get(“masterStep”).AllowStartifComplete(true).Partitioner(multith

  • 下面的代码有一个TaskMonitor类,它是Stephen Cleary的NotifyTask类的修改版本。Worker类使用TaskMonitor类异步运行Worker.CheckStatus。 Worker.CheckStatus经常会引发异常(例如数据库连接问题)。我希望TaskMonitor.Monitor阻止异常到达Program.Main并通过Exception和InnerExcep

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

  • 用例:步骤1:ItemReader:从数据库中读取1000个ItemProcessor块中的数据:处理这些数据。ItemWriter:将数据写入地图,以便下一步使用 步骤2:ItemReader:读取地图ItemProcessor:处理地图数据并获取新对象。ItemWriter:将新的进程对象持久化到数据库中。 现在我希望Map在整个作业中保持不变,目前我已经为Map创建了一个不同的POJO类,并

  • 我在Spring中设置了几个线性步骤。如果在任何一点上,一个步骤失败了,作业应该失败。 这些步骤包括多个微线程,然后是一个基于块的步骤。即。: 步骤1 任务1 小任务2 读者 处理器 作家 如果出现问题,最明显的做法就是抛出异常。Spring Batch将处理此问题并记录所有内容。这种行为,尤其是打印堆栈跟踪,是不可取的,如果作业可以优雅地结束,并将状态设置为。 Tasklet当前直接在上设置。它

  • 下面是JobLauncher.run()返回的JobExecution的内容,它发出作业运行成功的信号。 JobExecution:ID=0,Version=2,StartTime=Fri Nov 27 06:05:23 CST 2015,EndTime=Fri Nov 27 06:05:39 CST 2015,LastUpdated=Fri Nov 27 06:05:39 CST 2015,St

  • Zones 的猴子补丁方法只修补一次。 进入/离开 zone 只需更改Zone.current的值。(不需要进一步的猴子补丁) Zone.prototype.wrap method provides convenience for wrapping callbacks. (The wrapped callback is executed through Zone.prototype.runGuar

  • 关键点: 关键点: