Все @Scheduled
отмеченные вызовы будут использовать однопотокового исполнителя по умолчанию для планирования задач (asyn c или иным образом).
Все @Async
задачи передаются различным aysn c Threadpool Executor для выполнения с перехватчиком AOP.
Я думаю, что ваша путаница связана с тем, что асин c методы возвращают немедленно , но когда выполняется deleteOldData, он работает синхронно, как есть только один поток, он блокирует выполнение любых других запланированных задач.
Поскольку у вас есть пул потоков по умолчанию (один поток) для запланированных задач, они планируются один за другим.
Другие методы, помеченные @ Asyn c, выполняются, даже если это заканчивается или нет. В некоторых случаях у меня есть два способа выполнения одновременно. Но когда deleteOldData выполняется, методы asyn c останавливаются, пока не завершатся. Это то, что я не понимаю, извините: / -
Это отличается от планирования - это когда ваш асин c исполнитель вступает в игру, и они запускаются одновременно.
Это можно исправить одним из двух способов:
Вы можете использовать spring.task.scheduling.pool.size=10
в свойствах приложения, чтобы установить размер пула планировщика задач.
В качестве альтернативы можно использовать разные планировщики задач. Продолжайте использовать планировщик по умолчанию для задачи @Scheduled
и настройте что-то вроде ниже для asyn c задач (удалить запланированную аннотацию)
Требуется усовершенствование для передачи планировщика задач в аннотацию @Scheduled
до тех пор, пока вы не получите для планирования задач вручную.
Зарегистрируйте новый планировщик задач для вызовов asyn c и запланируйте методы на этапе после создания. Что-то вроде
Конфигурация
@Bean("asyncTaskScheduler")
public TaskScheduler asyncTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
Сервисы
@Autowired
private TaskScheduler asyncTaskScheduler;
@PostConstruct
void schedule() {
asyncTaskScheduler.scheduleAtFixedRate(this::checkAvailableTasks, 20000L);
asyncTaskScheduler.scheduleAtFixedDelay(this::checkBrokenEngines, 20000L);
}
@Async
public void checkBrokenEngines() {...}
@Async
public void checkAvailableTasks() throws Exception {...}