我们的 Spring Web 应用程序使用带有 Quartz 的 Spring Batch 来执行复杂的工作。这些作业中的大多数都在事务范围内运行,因为如果复杂系统的某个部分发生故障,我们希望回滚任何以前的数据库工作。然后,我们将调查问题、部署修复程序并重新启动服务器。
这将成为一个问题,因为其中一些作业需要进行大量处理并且可能需要很长时间才能运行。随着执行时间开始超过 1 小时,我们发现自己无法为生产环境部署其他问题的修复程序,因为我们不想中断一项重要的工作。
我一直在阅读 Reactor 实现作为我们问题的解决方案。我们可以做一点处理,发布一个事件,并让其他系统根据需要执行适当的操作。甜的!
我唯一的问题是,处理失败的最佳方法是什么?如果我发布了一个事件,而消费者未能执行某些关键功能,它会在稍后重新启动吗?
如果发布了一个事件,并且在所有侦听它的适当消费者可以适当地处理它之前,服务器关闭以进行部署怎么办?