Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring批处理-错误后恢复_Java_Spring_Spring Batch - Fatal编程技术网

Java Spring批处理-错误后恢复

Java Spring批处理-错误后恢复,java,spring,spring-batch,Java,Spring,Spring Batch,我有一个Spring批处理作业,它有一个ItemProcessor,可能会因异常而失败。如果发生这种情况,我会有一个ItemProcessListener来处理恢复(将该项标记为失败,以便在下次运行时不会拾取它) 该解决方案的工作原理与“常规”异常类似,但是我最近遇到了一个java.lang.OutOfMemoryError:java堆空间错误,其中未调用onProcessError(),并且在下次运行时不会排除该项 然而,我注意到调用了JobExecutionListener.afterJob

我有一个Spring批处理作业,它有一个
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
,它们允许在垃圾收集时进行一些特殊处理。