如果突然结束,如何从特定点重新启动spring批处理

h22fl7wq  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(366)

这个问题在这里已经有答案了

如何重新启动一个失败的spring批处理作业,让它恢复到原来的状态(3个答案)
两个月前关门了。
在阅读了大量关于spring batch重启的内容后,我了解到:
某人可以从一个作业失败的地方重新开始一个步骤。例如:job1->step1、step2、step3(fail)->然后您可以从step3重新启动
我想要另一种行为,但我没有找到适合我的解决办法。
我一步到位就找到了工作。这个步骤读取一个文本文件(可以有很多行)。我想覆盖我们的系统,以防出现非预期的结束(例如,我们的服务器突然关闭)在这种情况下,如果我们读取了x行,我想将作业从x+1行恢复到最后。
¿这有可能实现吗?
提前谢谢。

nfs0ujit

nfs0ujit1#

在我看来,如果作业在第x行突然停止,而您希望从第x+1行开始,那么只有当块大小为1时才会发生这种情况。因为当chunk size为1时,每个处理的条目都被提交,jobcontext确切地知道何时失败以及从何处重新启动。
如果区块大小大于1,比如说8,并且在处理项目4时作业突然停止,那么区块中处理的前3个项目在失败时也不会提交到作业执行表,上下文将从第一个条目的同一区块开始。在这种情况下,您将再次处理前3项!
如果在发生内核中断时启用正常关闭spring批处理作业,以便在进程结束前完全处理块,则可以避免这种情况。这将最大限度地减少报告的事件数,但仍有可能出现这样的情况-当服务器的电源插头被拔下时,程序没有机会正常关闭。
建议:
如果过程是幂等的,则重新处理某些项不会有问题
如果进程不是幂等的,可能可以在复合处理器中进行某种重复数据消除检查。
为了优雅地关闭作业,我编写了一些poc代码。你可以在这里看到-https://github.com/innovationchef/batchpay/blob/master/src/main/java/com/innovationchef/batchcommons/jobmanager.java

相关问题