Перекрытие Spring @Scheduler

У меня есть 2 метода для периодического запуска с весенним планировщиком, один с @Scheduled(fixedRate=300000) - каждые 5 минут, а другой с @Scheduled(cron="0 0 0 2 * * ?) - ежедневно в 2 часа ночи. не используют taskScheduler с пулом потоков, поэтому он использует только один поток, чтобы не было перекрытия.

Я заметил, что когда 5-минутная работа занимает больше времени (скажем,> 30 минут), она не позволяет запускать другую работу @Scheduled. Предположим, моя 5-минутная работа началась в 1:45, и на ее обработку ушло 45 минут. Другой cron, который должен начаться в 2 часа ночи, не мог запуститься, потому что поток был занят в 5-минутной работе. Есть ли какие-либо настройки, при которых другая работа в 2 часа ночи начнется, как только поток будет выпущен. Помогите нам понять поведение потоков в таких случаях.


person Barvepan    schedule 14.07.2017    source источник


Ответы (1)


По умолчанию планировщик Spring предоставляет один поток для выполнения задания. Вы можете настроить исполнителя задач с более чем 1 потоком и очередью, чтобы даже если все потоки заняты, задание добавлялось в очередь и забиралось, как только поток освобождался.

В следующем примере создается простой ScheduledThreadPool.

@EnableScheduling
@Configuration
public class Configuration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar 
     scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(5);
    }
}
person churchinvirus    schedule 30.10.2017