Spring Batch - восстановление после ошибки
У меня есть Spring Batch Job с ItemProcessor
это может потерпеть неудачу с исключением. Если это произойдет, у меня есть ItemProcessListener
в месте, которое обрабатывает восстановление (помечая элемент как неудачный, чтобы он не был поднят при следующем запуске).
Это решение работает как брелок с "обычными" исключениями, однако я испытал java.lang.OutOfMemoryError: Java heap space
ошибка недавно где onProcessError()
не вызывается, и элемент не будет исключен при следующем запуске.
Я заметил, однако, что JobExecutionListener.afterJob()
вызывается там, где я мог бы получить параметры задания неудачного выполнения и снова запросить все элементы этого исполнения и пометить их как неудачные.
Есть ли лучший подход к моей проблеме?
1 ответ
В принципе onProcessError
плохо назван. Он только слушает Exception
с, не для Error
s. Java настоятельно не рекомендует обрабатывать Error
с помощью перехватчиков. Причина в том, что JVM сообщает об ошибке, которая не в программировании, а в конфигурации виртуальной машины через Error
, Их следует воспринимать как сильный индикатор, ваша vm-настройка нуждается в коррекции.
В вашем случае вы пишете о OutOfMemoryError
что происходит, если ваша потребность в памяти выше, чем память, которая была назначена Java-заданию через стартовые параметры -Xmx/Xms. Вы либо выделяете мало памяти, либо потребляете слишком много. Это должно быть исправлено, а не поймано каким-то техническим приемом.
Прежде всего, вы должны выяснить, что вызывает эту ошибку. Возможно, вам просто нужно выделить больше памяти, возможно, некоторые из ваших алгоритмов слишком жадны в потреблении памяти и, скорее всего, у вас утечка памяти в качестве основной причины.