在spring批处理中抛出异常并且优雅地失败

时间:2015-03-05 10:03:42

标签: spring spring-batch

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

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

  1. 你觉得这种方法有什么问题吗?
  2. 是否有一个类在作业和设置状态,失败原因等中捕获异常(我知道对于reades,处理器和编写器,有些监听器有N但是如果{{1}发生错误怎么办? }}?
  3. 如何从内部作业组件或在异常时调用的某种侦听器中优雅地失败作业?

1 个答案:

答案 0 :(得分:2)

关于重新启动N次失败的作业,我们实施了预定的单独作业,并且每10分钟运行一次,检查弹簧批处理的元表并重新启动尝试。我们使用查询创建了自定义JobInstanceDao,该查询仅会选择失败时间少于N次的实例。

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

除了所有这些之外,我们还使用spring retry mechanism来进行肥皂调用,这使我们的工作能够抵御客户端服务器通信错误。