繁体   English   中英

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

[英]Spring batch : Propagate exception encountered in partitioned step (Stop job execution)

背景

我目前有一个读取平面文件的 spring-batch 作业。 该作业使用MultiResourcePartitioner读取已拆分为 N 个较小文件的文件的物理分区。 这意味着文件的每个物理分区都会导致执行一个新的从属步骤来读取分区。

问题

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

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

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

如果读取任何物理分区有任何问题,则该从属步骤的执行将失败,并且 spring 批处理将记录异常。 这不会影响正在读取文件的不同物理分区的其余从步骤的执行; 然而,这不是理想的行为。

我认为“这不会影响其余从属步骤的执行”这一事实理想的行为。 通常情况下,后面的分割工作的一大块成并行执行的更小的任务的想法是,任务应独立于彼此和一个故障不会影响到其他人。 如果有一个逻辑要求一个任务失败来停止其他任务,这意味着任务没有很好地定义为独立的,并且在本地/远程分区步骤中执行它们首先不是合适的选择。

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

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

此外,如果其中一个工作失败,则停止/使所有工作人员失败的这种设计不适合重新启动作业。 这意味着重新启动作业将重新启动所有分区,这不是分区作业首先应重新启动失败分区的目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM