登录
首页 >  文章 >  java教程

解决Java中多个@Scheduled注解的定时任务不执行问题

来源:亿速云

时间:2024-03-29 09:00:33 478浏览 收藏

一分耕耘,一分收获!既然都打开这篇《解决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注解的定时任务不执行问题》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

声明:本文转载于:亿速云 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>