1

大規模なアプリケーションの一部として、チャンク指向のタスクレット (リーダー、プロセッサー、ライター) だけで構成される Spring Batch ジョブをセットアップしました。ジョブはメイン スレッドでは実行されません。

時折、タスクレット コードが OutOfMemoryError をスローします。そこで、スレッドの UncaughtExceptionHandler を設定して、このようなエラーに対応できるようにし、アプリケーションを単純に終了させました。

しかし、OutOfMemoryError がスレッドの UncaughtExceptionHandler に到達することはありません。よくわからなくても、OutOfMemoryError はおそらく AbstractStep によって「飲み込まれた」と言えます。RepeatTemplate には確かに役割があります。OutOfMemoryError について一部の RepeatListeners に通知できる可能性がありますが、デフォルトではリスナーは登録されておらず、タスク定義の通常のタグを使用してそれらを登録することはできないようです。

いずれにしても、OoME が飲み込まれているため、OutOfMemoryError の後でも JVM は実行を続けます。これは、アプリケーションが実際にクラッシュしたことを明示しないため、好ましくありません。

では、Spring Batch がそのような種類のエラーを飲み込み、それらを処理する可能性を防ぐ方法について何かアドバイスはありますか?

もちろん、OoME の修正にも取り組んでいますが、エラーが発生した場合に JVM が単にクラッシュするだけでも安全だと思います。

Spring Batch 3.0.1 を使用しています。

4

0 に答える 0