Java Spring批处理-错误后恢复
我有一个Spring批处理作业,它有一个Java Spring批处理-错误后恢复,java,spring,spring-batch,Java,Spring,Spring Batch,我有一个Spring批处理作业,它有一个ItemProcessor,可能会因异常而失败。如果发生这种情况,我会有一个ItemProcessListener来处理恢复(将该项标记为失败,以便在下次运行时不会拾取它) 该解决方案的工作原理与“常规”异常类似,但是我最近遇到了一个java.lang.OutOfMemoryError:java堆空间错误,其中未调用onProcessError(),并且在下次运行时不会排除该项 然而,我注意到调用了JobExecutionListener.afterJob
ItemProcessor
,可能会因异常而失败。如果发生这种情况,我会有一个ItemProcessListener
来处理恢复(将该项标记为失败,以便在下次运行时不会拾取它)
该解决方案的工作原理与“常规”异常类似,但是我最近遇到了一个java.lang.OutOfMemoryError:java堆空间
错误,其中未调用onProcessError()
,并且在下次运行时不会排除该项
然而,我注意到调用了JobExecutionListener.afterJob()
,我可以从中获取失败执行的作业参数,并再次查询该执行的所有项目,并将它们标记为失败
有更好的方法解决我的问题吗?基本上
onProcessError
的名字不好。它只侦听异常
s,不侦听错误
s。Java强烈反对通过catch块处理错误。原因是,jvm通过错误
发出故障信号,该故障不在编程中,而是在vm的配置中。它们应该被视为一个强有力的指标,您的虚拟机设置需要纠正
在本例中,您编写了一个OutOfMemoryError
,如果您的内存需求高于通过-Xmx/Xms startparameters分配给Java作业的内存,则会发生该错误。要么分配的内存太少,要么消耗的内存太多。这应该是固定的,而不是通过一些技术手段
首先,您应该找出导致此错误的原因。也许你只需要分配更多的内存,也许你的一些算法在内存消耗方面过于贪婪,而且不太可能,你的根本原因是内存泄漏。你能发布一些代码吗?那太好了。我们进行了一个额外的步骤,在定义的时间段后删除所有“挂起”项,作为问题的解决方案。我们确切地知道是什么导致了我们的问题,但由于我们的限制,这是无法解决的。如果我们至少能够在ItemProcessListener.onProcessError()
中记录一些信息,那就太好了。在 ActudioPase.ExcReUTE()<代码>中,有点不一致。“任何代码>可投掷的< /代码>被捕获,并且执行的退出状态被更新并保存在考虑<代码> OutOfMeMyRebug < /C> >。@ USER 109501:您应该考虑两个进一步的选项。Java允许使用-XX:OnOutOfMemoryError
选项指定oome情况下的任意OS命令(例如,一起杀死vm)。您还可以查看特殊引用SoftReference
或WeakReference
,它们允许在垃圾收集时进行一些特殊处理。