我有一个ItemProcessor
的Spring批处理作业可能会因异常而失败。如果发生这种情况,我有一个ItemProcessListener
来处理恢复(将项目标记为失败,以便在下次运行时不会被拾取)。
这个解决方案的作用就像一个常规'例外情况,但我最近遇到java.lang.OutOfMemoryError: Java heap space
错误,但未调用onProcessError()
且该项目在下次投放时不会被排除。
但是我注意到调用JobExecutionListener.afterJob()
,我可以获取失败执行的作业参数,并再次查询该执行的所有项,并将其标记为失败。
对我的问题有更好的解决方法吗?
答案 0 :(得分:1)
基本上onProcessError
名不副实。它只侦听Exception
,而不是Error
s。 Java强烈反对通过catch-blocks处理Error
。原因是,jvm通过Error
发出故障信号,该故障不在编程中,而是在vm的配置中。它们应被视为强有力的指标,您的虚拟机设置需要更正。
在您的情况下,如果您的内存需求高于内存(通过-Xmx / Xms startparameters分配给Java作业),则会写一个OutOfMemoryError
。您要么分配给小内存,要么消耗太多内存。这应该是固定的,而不是通过一些技巧来捕获。
首先,您应该找出导致此错误的原因。也许你只需要分配更多的内存,可能你的一些算法在内存消耗方面太贪婪而且不太可能,你的内存泄漏是根本原因。