Ошибка конфигурации рабочего пакета Spring — обработки

#java #spring #spring-batch

Вопрос:

У нас есть пакетное приложение Spring, которое планируется запускать каждые 30 минут, которое создает рабочих в облаке в виде отдельных модулей.

В классе конфигурации один из компонентов подключается к базе данных и считывает некоторые свойства. Если по какой-либо причине это соединение с БД не удается, то рабочий не запускается, а основное задание не запускается снова через 30 минут.

Это происходит потому, что, если рабочий процесс завершается сбоем при запуске, он не обновляет конечный статус в БД или не сообщает об этом ведущему как о сбое. Следовательно, Мастер предполагает, что он все еще работает, и не запускает Пакет снова.

У кого-нибудь есть какие-либо предложения о том, как с этим справиться и как обеспечить, чтобы Мастер снова запускал рабочих в запланированный срок?

Комментарии:

1. that creates workers on the Cloud as separate pods : Как создаются рабочие? Как управляется жизненный цикл работников? Можете ли вы поделиться более подробной информацией о своей настройке?

2. Рабочие создаются с помощью загрузчика ресурсов Docker. Периодически основное задание выполняет запрос, который извлекает список записей, подлежащих обработке. Как только у него появится список, в зависимости от размера списка, он создаст один или несколько рабочих модулей и распределит нагрузку между ними. Эти рабочие модули затем обрабатывают данные и переходят в состояние завершения.

3. Менеджер не может знать о статусе работника, если работник не сообщает об этом. Однако менеджер может быть настроен с таймаутом для этого. Поэтому, если вы хотите, чтобы менеджер вышел из строя до выполнения следующего расписания, вам необходимо установить время ожидания менее 30 минут. Тем не менее, я бы рекомендовал, чтобы у каждого расписания была своя работа, чтобы неудачное задание не повлияло на последующие расписания.

4. Спасибо. Есть ли также удобное свойство, которое можно добавить в приложение.properties, чтобы установить время ожидания (не удалось его найти), или нам нужно установить его с помощью кода?

5. Нет, вы можете установить время ожидания на MessageChannelPartitionHandler или через построитель RemotePartitioningManagerStepBuilder#timeout .

Ответ №1:

проблема заключается в высокой доступности.

Вы можете добавить redis в начало базы данных. Если мы не можем прочитать конфигурацию из redis, а затем подключить базу данных.

2 наконец, добавьте службу повторных попыток, такую как resilience4j, в свой компонент, чтобы прочитать вашу конфигурацию несколько раз.

3rdly, для предупреждения, вы можете добавить соответствующую службу предупреждений в своем облаке, чтобы сообщить вам, какой модуль не запустился. Затем вы сможете перезапустить этот модуль вручную или автоматически.

Комментарии:

1. Хорошо, мы можем добавить устойчивость к многократному чтению и слой Redis, но нет ли способа автоматически перепланировать, чтобы планировщик запустил и снова запустил пакет? Проблема в том, что на производстве партии планируется запускать в ночное время. И все виды работ по техническому обслуживанию также происходят ночью. Таким образом, если проводилось техническое обслуживание и пакет запускался в одно и то же мгновение, он вообще не запускается на следующий день, если мы не перезапустим его вручную.

2. Я прошу прощения. Мне приснился кошмар, когда я пытался реализовать очередь сообщений в реальном времени, так что у меня даже не было времени проверить сообщение на stackoverflow. Думаю, сейчас я понимаю, что ты имеешь в виду. Вам должны понадобиться реестр служб и обнаружение. Если рабочий модуль вышел из строя из-за технического обслуживания или каких-либо других ошибок. Мы бы получили уведомление. Если ваша работа в quartz выполняется по графику 30 минут, служба избыточного расписания уведомит работника о выполнении работы через 30 минут. Если эта 30-минутная задержка повлияет на вашу систему, вы должны сохранить информацию об ошибке где-нибудь, а затем вызвать ее после того, как центр перезапустит работника.