Планировщик Spring Batch Job перестает выполняться после нескольких запусков - PullRequest
0 голосов
/ 24 сентября 2019

В проекте нам нужно запускать задание, которое запускается периодически (каждые 5 минут в QA env сейчас), которое обрабатывает некоторые задания для 40k пользователей.Мы решили использовать Spring Batch, потому что он идеально подходит и внедрили его с конфигурацией по умолчанию (например, он использует SyncTaskExecutor под капотом).Итак, есть задание, состоящее из одного шага с:

  1. из коробки HibernatePagingItemReader
  2. custom ItemProcessor, которое выполняет легкие вычисления в памяти
  3. custom ItemWriter, который сохраняет данные в той же базе данных PostgreSQL через несколько JPQL и собственных запросов.

Само задание запланировано с помощью @EnableScheduling и запускается каждые 5 минутВыражение cron:

@Scheduled(cron = "${job.assignment-rules}")
void processAssignments() {
  try {
    log.debug("Running assignment processing job");
    jobLauncher.run(assignmentProcessingJob, populateJobParameters());
  } catch (JobExecutionException e) {
    log.error("Job processing has failed", e);
  }
}

Вот выражение cron из application.yml:

job:
  assignment-rules: "0 0/5  * * * *"

Проблема в том, что он перестает планироваться после нескольких запусков (каждый раз разное количество запусков),Давайте взглянем на схему Spring Batch:

select ex.job_instance_id, ex.create_time, ex.start_time, ex.end_time, ex.status, ex.exit_code, ex.exit_message
from batch_job_execution ex inner join batch_job_instance bji on ex.job_instance_id = bji.job_instance_id
order by start_time desc, job_instance_id desc;

enter image description here А затем тишина.Ничего особенного в логах.Единственное, что, я считаю, может иметь смысл, - это то, что в этом экземпляре выполняется еще две работы.И один из них занимает много времени, потому что он отправляет электронные письма через SMTP.Весь график работы:

job:
  invitation-email: "0 0/10 * * * *"
  assignment-rules: "0 0/5  * * * *"
  rm-subordinates-count: "0 0/30 * * * *"

Коллеги, кто-нибудь может указать мне, как можно решить эту проблему?

Заранее большое спасибо

1 Ответ

0 голосов
/ 24 сентября 2019

Использование по умолчанию SyncTaskExecutor для запуска заданий небезопасно в вашем случае использования, так как все задания будут выполняться одним потоком.Если для выполнения одного из заданий требуется более 5 минут, следующие задания будут накапливаться и в какой-то момент не запустятся.

Я бы настроил JobLauncher с асинхронной реализацией TaskExecutor (например, org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor) в вашем случае использования.Вы можете найти пример в разделе Настройка JobLauncher (см. «Рисунок 3. Последовательность асинхронного запуска задания»).

Помимо исполнителя задач, настроенного для использования JobLauncherSpring Batch, вы должны убедиться, что у вас есть правильный исполнитель задач, используемый Spring Boot для планирования задач (так как вы используете @EnableScheduling).Пожалуйста, обратитесь к разделу Выполнение и планирование для получения более подробной информации.

...