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