如何解决如果突然结束,如何从特定点重新启动春季批次
在阅读了大量有关在 Spring Batch 中重新启动的内容后,我了解到:
- SB 可以从作业失败的开始重新开始一个步骤。 例子:Job1 -> step1,step2,step3 (FAIL) -> 然后就可以从step3重新开始
我想要另一种行为,但我没有找到适合我的解决方案。
我有一个只需一步的工作。 这一步读取一个文本文件(可以有很多行)。 我想覆盖我们的系统,以防意外结束(例如,我们的服务器突然关闭) 在这种情况下,如果我们读取了 X 行,我想将作业从 X+1 行恢复到最后。
¿这有可能实现吗?
提前致谢。
解决方法
IMO,如果作业在第 X 行突然停止并且您想从第 X+1 行开始,则只有在块大小为 1 时才会发生。因为当块大小为 1 时,每个处理的条目都会被提交,并且 JobContext确切知道它何时失败以及从哪里重新启动。
当您的块大小大于 1 时,假设为 8,并且您的作业在处理第 4 项时突然停止,则块中处理的前 3 个项目在失败时也不会提交到作业执行表并且上下文将从第一个条目的同一块开始。在这种情况下,您将再次处理前 3 个项目!
如果在发生内核中断时启用 Spring Batch 作业的优雅关闭,以便在进程结束之前完全处理该块,则可以避免这种情况。这将最大限度地减少报告的事件数量,但仍有可能 - 当您拔下服务器的电源插头并且程序没有机会正常关闭时。
建议:
- 如果过程是幂等的,那么重新处理一些项目也没有问题
- 如果进程不是幂等的,可能可以在 CompositeProcessor 中进行某种重复数据删除检查。
为了正常关闭作业,我编写了一些 PoC 代码。你可以在这里看到它 - https://github.com/innovationchef/batchpay/blob/master/src/main/java/com/innovationchef/batchcommons/JobManager.java
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。