Spring Batch - 错误后恢复

时间:2017-08-22 10:49:41

标签: java spring spring-batch

我有一个ItemProcessor的Spring批处理作业可能会因异常而失败。如果发生这种情况,我有一个ItemProcessListener来处理恢复(将项目标记为失败,以便在下次运行时不会被拾取)。

这个解决方案的作用就像一个常规'例外情况,但我最近遇到java.lang.OutOfMemoryError: Java heap space错误,但未调用onProcessError()且该项目在下次投放时不会被排除。

但是我注意到调用JobExecutionListener.afterJob(),我可以获取失败执行的作业参数,并再次查询该执行的所有项,并将其标记为失败。

对我的问题有更好的解决方法吗?

1 个答案:

答案 0 :(得分:1)

基本上onProcessError名不副实。它只侦听Exception,而不是Error s。 Java强烈反对通过catch-blocks处理Error。原因是,jvm通过Error发出故障信号,该故障不在编程中,而是在vm的配置中。它们应被视为强有力的指标,您的虚拟机设置需要更正。

在您的情况下,如果您的内存需求高于内存(通过-Xmx / Xms startparameters分配给Java作业),则会写一个OutOfMemoryError。您要么分配给小内存,要么消耗太多内存。这应该是固定的,而不是通过一些技巧来捕获。

首先,您应该找出导致此错误的原因。也许你只需要分配更多的内存,可能你的一些算法在内存消耗方面太贪婪而且不太可能,你的内存泄漏是根本原因。