Создает ли Spring Boot ConcurrentTaskScheduler новые потоки для каждой запланированной задачи или может вызвать блокировJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Создает ли Spring Boot ConcurrentTaskScheduler новые потоки для каждой запланированной задачи или может вызвать блокиров

Сообщение Anonymous »

У нас есть много запланированных заданий Spring Boot 2.7, которые определяются следующим образом:
// 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 случай, если одно задание cron не завершено до запуска следующих триггеров? Запускает ли каждое задание в новом потоке асинхронно из любого потока, используемого планировщиком для отслеживания времени?
Есть сообщение, в котором говорится, что 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»