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

时间:2016-03-14 11:05:37

标签: java spring exception spring-batch partitioning

背景

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

问题

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

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

如何让spring-batch将从属步骤中发生的任何异常一直传播到2016-03-14 01:18:30 Running command: "['C:\\Python27\\pythonw.exe', '-u', 'C:\\Program Files (x86)\\Google\\google_appengine\\appcfg.py', '--oauth2_credential_file=C:\\Users\\Bryce/.appcfg_oauth2_tokens', 'update', 'C:\\Users\\Bryce\\Desktop\\ShaolinP']" 01:19 AM Application: shaolinpretzels; version: 2 01:19 AM Host: appengine.google.com 01:19 AM Starting update of app: shaolinpretzels, version: 2 01:19 AM Getting current resource limits. 01:23 AM Scanning files on local disk. Error 409: --- begin server output --- Another transaction by user classsicb is already in progress for app: s~shaolinpretzels, version: 2. That user can undo the transaction with "appcfg rollback". --- end server output --- 2016-03-14 01:29:21 (Process exited with code 1) You can close this window now. 启动的位置?我想这样做,以便在处理任何分区文件时出现问题,我可以暂停任何进一步的处理。

1 个答案:

答案 0 :(得分:0)

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

我认为“这不会影响其余从属步骤的执行”这一事实 是期望的行为。通常,将大量工作划分为并行执行的较小任务的想法是,任务应该彼此独立,并且一个失败应该影响其他任务。如果有一种逻辑要求一个任务无法停止其他任务,则意味着这些任务没有很好地定义为独立的,因此首先在本地/远程分区步骤中执行它们不是适当的选择。

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

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

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