在 spring 批次中抛出异常并优雅地失败

Throwing exceptions in spring batch and failing gracefully

ItemReader@BeforeStep 中,我们正在调用 soap 客户端以填写要稍后在 read() 方法中处理的项目列表。由于我们的应用程序和第 3 方服务器之间的通信错误,该调用可能会引发异常。我们有每 10 分钟触发一次的调度程序,并尝试重新启动失败的作业并使该作业通过(因为会发生通信错误,但会在一段时间后修复)。

我们希望自动化作业执行并处理作业流程中的所有异常,在一个地方捕获它们并优雅地使作业失败(最好是有错误的原因),并有一些机制可以尝试重新启动作业但停止在 N 之后尝试并通过电子邮件通知某人查看错误原因。重新启动尝试后出现异常的完整异常日志将非常庞大,因此我们希望避免这种情况。

  1. 您认为这种方法有什么问题吗?
  2. 是否有一个 class 可以捕获作业中的异常和设置状态、失败原因等(我知道对于读取、处理器和写入器来说,有些侦听器具有 onReadError 但是如果错误发生在 @BeforeStep?
  3. 如何从内部作业组件或异常调用的某种侦听器中优雅地使作业失败?

关于重新启动失败 N 次的作业,我们实施了单独的计划作业,每 10 分钟运行一次,检查 spring 批次的元表并尝试重新启动。我们创建了带有查询的自定义 JobInstanceDao,它将仅选取失败少于 N 次的实例。

关于作业本身的失败作业,我们添加了 JobExecutionDecider 实现,它正在检查失败异常,并且在我们感兴趣的异常上调用逻辑来设置 FlowExecutionStatus。基本上我们导入了 csv 文件,如果发生解析异常(因为这不是我们可以恢复的东西),我们希望完成作业,如果发生其他异常,我们希望作业失败,因为可以恢复并且重启逻辑应该将其拾取。

除此之外,我们还使用了 spring retry mechanism 作业来执行 soap 调用,这使得我们的作业能够抵抗客户端服务器通信错误。