Spring boot application Планировщики не работают, если одному из планировщиков требуется больше времени для запуска - PullRequest
0 голосов
/ 19 марта 2020

У меня есть планировщики в приложении весенней загрузки, если какой-либо один планировщик тратит время на выполнение процесса, а оставшийся планировщик не будет работать в указанное время или после указанного интервала времени c.

    @Component
public class ScheduledTask(){

@Scheduled(cron ="0 00 01 1/1 * ? ")
public void method1(){
//process 1 do something.

}

@Scheduled(initialDelay =5000, fixedRate=900000)
public void method2(){
//process 2 do something.

}

@Scheduled(cron ="0 10 00 1/1 * ? ")
public void method3(){
//process 3 do something.

}

@Scheduled(cron ="0 10 00 1/1 * ? ")
public void method4(){
//process 4 do something.

}

@Scheduled(initialDelay =5000, fixedRate=900000)
public void method5(){
//process 5 do something.

}


}

Объяснение: method5 & method2 работают каждые 15 минут. Но предположим, что если мой метод 5 требует больше времени для обработки, тогда мой планировщик (метод 2) не запустится в следующие 15 минут. Точно так же, если мой метод 5 отнимает слишком много времени для обработки и если наступает время планирования метода method1 и method4 (здесь, например, 1AM), но все же эти планировщики не будут работать в это время.

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

1 Ответ

1 голос
/ 19 марта 2020

По умолчанию расписания в Spring Boot Context являются однопоточными. Когда вам нужно запустить параллельные задачи, вы используете класс @Configuration для реализации интерфейса SchedulingConfigurer. Это позволяет получить доступ к базовому экземпляру ScheduledTaskRegistrar. Например, в следующем примере показано, как настроить Executor для параллельного выполнения запланированных задач.

@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {

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

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }
}

Пожалуйста, прочитайте: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html

...