我想实现多个@Scheduled(具有固定延迟)任务,每个任务都有自己的线程池。
@Scheduled(fixedDelayString = "30000")
public void createOrderSchedule() {
//create 10 orders concurrently; wait for all to be finished
createOrder(10);
}
@Scheduled(fixedDelayString = "30000")
public void processOrderSchedule() {
//process 10 orders concurrently; wait for all to be finished
}
@Scheduled(fixedDelayString = "30000")
public void notifySchedule() {
//send notification for 10 orders concurrently; wait for all to be finished
}
我设法为每个调度程序创建了不同的ThreadPoolTaskExecutor
,如下所示:
@Bean("orderPool")
public ThreadPoolTaskExecutor createOrderTaskExecutor() {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setCorePoolSize(5);
pool.setMaxPoolSize(10);
pool.setThreadNamePrefix("order-thread-pool-");
pool.setWaitForTasksToCompleteonShutdown(true);
return pool;
}
..
我为每个任务提供了@Async
。
@Async("orderPool")
public void createOrder(Integer noOforders) {..}
和任务计划程序配置
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(3);
return threadPoolTaskScheduler;
}
我使用CompletableFuture.allOf(..).join();
等待每个任务完成,但它阻塞了其他@Scheduled
个任务。
总而言之,我想实现以下目标:
- 每个
@Scheduled
任务应独立运行,而不会阻止其他@Scheduled
个任务。 - 每个
@Scheduled
任务都应该具有自己的线程池,以便它可以同时运行多个子任务(例如10)。 - 每个
@Scheduled
任务必须等待每个触发器完成而不会再次被调用。
我该如何实现?