// runs every 1 minute
@Scheduled(cron = "0 */1 * * * *")
public void doSomethingImportant() {
log.info("1 min event scheduler started..");
try {
Thread.sleep(70000);
} catch (InterruptedException e) {
log.info("1 min event scheduler interupted..");
}
log.info("1 min event scheduler finished..");
}
// runs every 10 minutes
@Scheduled(cron = "0 */10 * * * *")
public void doSomethingElseImportant() {
// work
}
При такой конфигурации:
@Configuration
@EnableAsync
public class SchedulerConfiguration {
@Bean
public TaskScheduler taskScheduler() {
return new ConcurrentTaskScheduler();
}
@Bean
public Executor taskExecutor() {
return new SimpleAsyncTaskExecutor();
}
}
Мы хотим, чтобы каждый запущенный doSomethingImportant запускался в своем собственном потоке, чтобы:
- если вызов занимает более 5 минут, он не будет задерживать следующий запланированный вызов (т. е. вызов doSomethingImportant не может заблокировать планирование будущих вызовов самого себя или будущих вызовов других запланированных заданий).
- мы можем установить контекст MDC для каждого призыв задания в классе doSomethingImportant без его прерывания другими вызовами.
Есть сообщение, в котором говорится, что ConcurrentTaskScheduler использует только один поток. В этом случае мы предполагаем, что если все запущенные запланированные задания используют один и тот же поток, могут возникнуть проблемы с производительностью, и нам потребуется создать какой-то механизм для запуска каждого из них в своем собственном потоке? Это может показаться слишком большим количеством стандартного кода, если нам придется добавлять его к каждому плановому заданию (у нас их сотни). Или есть что-то вроде ConcurrentTaskScheduler, которое создает новый поток для каждого задания?
Выходные данные теста показывают, что ConcurrentTaskScheduler блокируется (и пропускает расписания, например, для 28-й минуты ниже) и использует только одна нить. Так в чем же смысл ConcurrentTaskScheduler?
2025-01-06T15:27:00,011Z INFO pool-2-thread-1 c.c.g.scheduler.doSomethingImportant[] => 1 min event scheduler started..
2025-01-06T15:28:10,020Z INFO pool-2-thread-1 c.c.g.scheduler.doSomethingImportant[] => 1 min event scheduler finished..
2025-01-06T15:29:00,006Z INFO pool-2-thread-1 c.c.g.scheduler.doSomethingImportant[] => 1 min event scheduler started..
2025-01-06T15:30:10,011Z INFO pool-2-thread-1 c.c.g.scheduler.doSomethingImportant[] => 1 min event scheduler finished..
Подробнее здесь: https://stackoverflow.com/questions/793 ... cheduled-t
Мобильная версия