java中多个@Scheduled定时器不执行的解决方法
作者:北漂编程小王子
在应用开发中经常需要一些周期性的操作,比如每5分钟执行某一操作等,这篇文章主要给大家介绍了关于java中多个@Scheduled定时器不执行的解决方法,需要的朋友可以参考下
项目背景:在项目中包含两个定时任务,配置信息如下:
1、@Scheduled(initialDelay = 1,fixedDelay=10000)
public voud aa(){}
1、@Scheduled(initialDelay = 1,fixedDelay=10000)
public voud bb(){}
我们需要的都是项目启动后,同时调用执行aa 和bb 方法,我们发现只能执行其中一个!那么如何解决呢?
原因是:@Scheduled注解会在默认情况下以单线程的方式执行定时任务。
这个“单线程”指两个方面:
如果一个定时任务执行时间大于其任务间隔时间,那么下一次将会等待上一次执行结束后再继续执行。
如果多个定时任务在同一时刻执行,任务会依次执行。
我们项目都是配置了initialDelay =1 ,Scheduled启动一个的时候,另外一个根本得不到执行!当然fixedDelay是可以正常按照执行间隔来执行的,就是首次执行收到影响!
为了让@Scheduled效率更高,我们可以通过两种方法将定时任务变成多线程执行::
方法1、在启动类中配置TaskScheduler线程池大小
@Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(10);//不配置默认是1 return taskScheduler; }
方法2、利用Spring提供的@Async注解和@EnableAsync注解
@Component @EnableAsync public class TimedTask{ @Async @Scheduled(initialDelay = 1,fixedDelay=10000) public void aa() { //执行你的业务逻辑 } @Async @Scheduled(initialDelay = 1,fixedDelay=10000) public void bb() { //执行你的业务逻辑 }
总结
到此这篇关于java中多个@Scheduled定时器不执行的文章就介绍到这了,更多相关java多个@Scheduled定时器不执行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!