В проекте нам нужно запускать задание, которое запускается периодически (каждые 5 минут в QA env сейчас), которое обрабатывает некоторые задания для 40k пользователей.Мы решили использовать Spring Batch, потому что он идеально подходит и внедрили его с конфигурацией по умолчанию (например, он использует SyncTaskExecutor
под капотом).Итак, есть задание, состоящее из одного шага с:
- из коробки
HibernatePagingItemReader
- custom
ItemProcessor
, которое выполняет легкие вычисления в памяти - 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;
А затем тишина.Ничего особенного в логах.Единственное, что, я считаю, может иметь смысл, - это то, что в этом экземпляре выполняется еще две работы.И один из них занимает много времени, потому что он отправляет электронные письма через SMTP.Весь график работы:
job:
invitation-email: "0 0/10 * * * *"
assignment-rules: "0 0/5 * * * *"
rm-subordinates-count: "0 0/30 * * * *"
Коллеги, кто-нибудь может указать мне, как можно решить эту проблему?
Заранее большое спасибо