作为更大的应用程序的一部分,我设置了一个Spring Batch作业,它只由一个面向块的tasklet组成:读者,处理器和编写器。作业不在主线程中运行。
有时,tasklet代码会抛出OutOfMemoryError。因此,我设置线程的UncaughtExceptionHandler以便能够对这些错误做出反应,只需终止应用程序。
但OutOfMemoryError永远不会到达线程的UncaughtExceptionHandler。我会说OutOfMemoryError被“吞噬”,可能是由AbstractStep,即使我不确定。 RepeatTemplate肯定是一个角色。它可以通知一些RepeatListeners有关OutOfMemoryError的信息,但默认情况下没有注册任何监听器,似乎无法通过任务定义中的通常标记注册任何监听器。
无论如何,即使在OutOfMemoryError之后,JVM也会继续运行,因为吞下了OoME。这并不好,因为它没有明确表明应用程序实际崩溃了。
那么,您对如何阻止Spring Batch吞下这种错误并有可能处理它们有什么建议吗?
显然我们也在修复OoME,但我认为如果JVM在出现错误时会崩溃,那将是安全的。
我正在使用Spring Batch 3.0.1。