spring boot的定时任务

1.启用定时任务

在启动类上增加注解@EnableScheduling,就启用了spring boot的定时任务

2.配置定时任务的配置文件

在一个被@Configuration标注的类上,增加注解@EnableAsync开启异步事件的支持。
然后增加配置

/*
   此处成员变量应该使用@Value从配置中读取
    */
    private int corePoolSize = 10;
    private int maxPoolSize = 20;
    private int queueCapacity = 10;

    // Executor 是 import java.util.concurrent.Executor;
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }

这样做的目的是为了开启多线程支持定时任务。如果你不增加这个配置,同时你又有多个不同的定时任务在执行,那么执行定时任务的其实是同一个线程。 当有一个定时任务卡住时,其他的定时任务都不能执行。
配置了这个以后,每个定时任务都是一个单独的线程,自己执行自己的定时任务,互不影响。
但也有个问题,比如定时任务A是每10秒钟执行一次,在一次执行时卡住了,到了10秒的时候还没执行完,那么定时任务A会又启动一个新的线程来执行,也就是说你同时有两个定时任务A在执行,所以要注意这点,看是否对你有影响。

3. 增加定时任务代码

定时任务方法上要增加注解@Async,如果你不使用这个注解,那么你还是以一个线程来执行定时任务,不是多线程的

@Async
@Scheduled(cron = "0/10 * * * * ?")
public void process() {
    logger.info("#################### do something start ######################");


    logger.info("#################### do something end #######################");
}

4. 几种写法:

  1. @Scheduled(cron = “0/10 * * * * ?”) 表达式,没啥说的
  2. @Scheduled(fixedRate = 5000) 感觉跟表达式,差不多,每5秒执行一次
  3. @Scheduled(fixedDelay = 5000), 从测试结果看,依然是每5秒执行一次
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值