在@BeforeStep
的{{1}}中,我们正在调用soap客户端来填写稍后要在ItemReader
方法中处理的项目列表。由于我们的应用程序和第三方服务器之间的通信错误,该调用可能抛出异常。我们有每10分钟触发一次的调度程序,并尝试重新启动失败的作业,并使这个作业通过(因为通信错误发生但在一段时间后修复)。
我们希望自动执行作业并处理作业流中的所有异常,在一个地方捕获它们并优雅地失败作业(最好是出于错误的原因),并且有一些机制可以尝试重新启动作业但是之后停止尝试read()
尝试并通过电子邮件通知某人,以查看错误原因。重新启动尝试后异常的完整日志将是巨大的,因此我们希望避免这种情况。
N
但是如果{{1}发生错误怎么办? }}?答案 0 :(得分:2)
关于重新启动N
次失败的作业,我们实施了预定的单独作业,并且每10分钟运行一次,检查弹簧批处理的元表并重新启动尝试。我们使用查询创建了自定义JobInstanceDao
,该查询仅会选择失败时间少于N
次的实例。
关于作业本身的失败作业,我们添加了JobExecutionDecider
实现,它正在检查失败异常,并且在我们感兴趣的异常中,我们正在调用逻辑来设置FlowExecutionStatus
。基本上我们导入了csv文件,我们希望在解析异常发生时完成这项工作(因为这不是我们可以恢复的东西),如果发生其他异常,我们想要失败,因为那可以恢复,重启逻辑应该可以恢复。
除了所有这些之外,我们还使用spring retry mechanism来进行肥皂调用,这使我们的工作能够抵御客户端服务器通信错误。