Как обновить состояние пакета Spring при неожиданном завершении работы

#spring #spring-batch #jobs

Вопрос:

Я внедряю службу, которая будет отклонять запросы на выполнение заданий от обработки, если выполняется существующее задание. К сожалению, я не уверен, есть ли способ определить разницу между активно выполняемым заданием и заданием, которое завершилось из-за неожиданного выключения, например, выключения Tomcat. Статусы в таблицах совпадают с status = НАЧАТО и exit_code = НЕИЗВЕСТНО.

         Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions("MY_JOB");
 

Есть ли способ отличить их друг от друга или реализация, которая изменила бы статусы активных заданий на, возможно, ЗАБРОШЕННЫЕ?

Ответ №1:

Действительно, просто просматривая базу данных, невозможно провести различие между эффективно выполняемым заданием и внезапно завершенным заданием (в обоих случаях статус есть STARTED ).

Что вам нужно сделать, так это, в дополнение к проверке состояния в базе данных, найти способ проверить, эффективно ли выполняется задание. Это действительно зависит от того, как вы выполняете свою работу. Например, если вы выполняете свои задания в отдельных JVM, вы можете написать некоторый код, который проверяет, есть ли JVM, в которой в данный момент выполняется ваше задание. Если вы развертываете свои задания в Kubernetes, вы можете спросить у Kubernetes, есть ли модуль, в котором в настоящее время выполняется ваша работа, и т. Д.

Тем не менее, если вы можете определить выполнение, которое было внезапно остановлено, для которого было зафиксировано состояние STARTED (потому что у Spring Batch не было возможности обновить свое состояние до FAILED с изящным завершением работы), то вы можете обновить состояние вручную ABONDONED и установить для него END_TIME значение, отличное от null. Таким образом, JobExplorer#findRunningExecutions он больше не будет возвращен как выполняемое выполнение.