将两个不同的TaskScheduler绑定到Spring Boot应用程序

问题描述 投票:2回答:1

我有以下问题:我的应用程序中有多个@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注释?

java spring scheduled-tasks scheduling
1个回答
0
投票

[可以简单地让以@Scheduled注释的方法调用以@Async(“ singleThreadScheduledExecutor”)注释的方法。“ multipleThreadScheduledExecutor”可以与异步方法并行运行,并且当相关的cron作业在时间上重叠时,异步方法在LinkedBlockingQueue中排队。要使其正常工作,还有两点很重要:

  1. 自调用–从同一类中调用async方法–无效
  2. 异步方法需要公开

这是必要的,因此spring可以围绕这些方法构建代理。

© www.soinside.com 2019 - 2024. All rights reserved.