Асинхронное выполнение динамически запланированных задач - PullRequest
0 голосов
/ 18 декабря 2018

Исходя из набора конфигураций, моя задача - создавать список запланированных задач, которые будут выполняться на основе CronTrigger, каждые x минут.Черновая версия реализации похожа на эту:

for(Config cfg:configs){
    Runnable task=()->doSomething(cfg);
    taskScheduler.schedule(task,new CronTrigger("0 0/"+cfg.getScheduledTimeInMinutes()+" * * * *"));
    }

taskScheduler - это bean-компонент, автоматически подключенный в текущем классе и определенный в классе конфигурации как:

    @Bean
public TaskScheduler taskScheduler() {
    return new ConcurrentTaskScheduler();
}

Все идет нормально.Все конфиги приводят к выполнению одного и того же метода с разными аргументами в назначенное время.Проблема в том, что для выполнения метода doSomething() требуется больше времени, а следующая запланированная задача должна быть запущена, или если одновременно запланировано более одной задачи.В этом случае происходит то, что выполнение не асинхронно, и каждая задача ожидает завершения предыдущей задачи.Возможно ли добиться одновременного выполнения этих запланированных задач?Я использую Java 8 и Spring Boot 2.0.

1 Ответ

0 голосов
/ 18 декабря 2018

Ну, это все хорошо, вы упускаете небольшую вещь или позвольте нам кое-что понять о выполнении запланированных задач в весенней среде:

Добавление этого (в ваш аннотированный класс @Configuration) решит вашу проблему:

@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
    return Executors.newScheduledThreadPool(5); // 5 is arbitrary, change it to suit you
}

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

Или лучше:

@Configuration
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
     ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
     taskScheduler.setPoolSize(100);
     taskScheduler.initialize();
     taskRegistrar.setTaskScheduler(taskScheduler);
   }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...