我有以下问题:我的应用程序中有多个@Scheduled
批注,它们定义了cron-jobs,它们可能同时运行。据我了解,标准行为是每个cron作业都由一个单线程TaskScheduler
执行,因此一次只能运行一个cron作业,所有其他作业都排队。这将是我期望的行为,但是我遇到的是作业并行运行。
经过大量搜索后,我发现运行状况检查所基于的类定义了具有多个线程的TaskScheduler
。
知道这一点,我想使用其多线程TaskScheduler
保留运行状况检查库,并定义另一个TaskScheduler
,它是单线程并由我的@Scheduled
批注使用。
我可以定义一个使用单线程调度程序的Bean:
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(THREADS_COUNT);
return threadPoolTaskScheduler;
}
但是怎么可能将此调度程序仅绑定到我的@Scheduled
注释?
[可以简单地让以@Scheduled注释的方法调用以@Async(“ singleThreadScheduledExecutor”)注释的方法。“ multipleThreadScheduledExecutor”可以与异步方法并行运行,并且当相关的cron作业在时间上重叠时,异步方法在LinkedBlockingQueue中排队。要使其正常工作,还有两点很重要:
这是必要的,因此spring可以围绕这些方法构建代理。