SpringBoot中使用Scheduling执行定时任务

29 篇文章 0 订阅

SpringBoot自带的 Schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多

以下任务都是在单线程下执行的

第一步 创建SpringBoot项目

第二步 添加@EnableScheduling开启定时任务

第三步 设置定时需要执行的任务

有两种方法设置执行时机

第一种我们就且叫他为普通方法

1.fixedRate:会为所有任务的开始执行时间编排一个表,假如fixedRate=5000,且第一次开始时间是10:00:00

任务    开始执行时间
任务1    10:00:00
任务2    10:00:05
任务3    10:00:10
任务4    10:00:15
任务5    10:00:20
   当执行任务耗时小于fixedRate设置的时间时,将会按照表中的开始时间执行任务,即每隔5秒会执行一个任务:

@Component
public class TestScheduling {
    private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
    @Scheduled(fixedRate=5000)
    public void myTask() throws InterruptedException {
        LOG.info("执行时间:{}",sdf.format(new Date()));
    }
}
      

   当执行任务耗时大于fixedRate设置的时间时,以下一张图就很清楚的表示了(图的出处)

解析一下:

fixedRate设置的也是为fixedRate=5000

第一个任务开始执行时间是0:00,耗时8秒

第二个任务本应该开始执行时间是0:05,但是第一个任务执行完时间已经是0:08,所以第二个任务在第一个任务执行完毕之后会立即执行,耗时是3s

第三个任务本应该开始执行时间是0:10,但是前两个任务执行完毕时间已经是0:11,所以第三个任务在第二个任务执行完毕之后会立即执行,耗时是3s

第四个任务,也同第二、第三个任务一样,在预计开始执行的时间(这里第四个任务预计开始执行时间是0:15),因为上一个任务还没有执行完毕,所以要等待上一个人执行完毕之后才会执行。

第五个任务预计开始执行时间是0:20,而前四个任务在0:19已经执行完毕,需要等待1秒,到达我们预计的开始执行时间(0:20)才会执行第五个任务。

2.fixedDelay

这个就比之前的fixedRate简单得多。如设置fixedRate=5000.下一个任务只需要盯着上一个任务的屁股(执行完毕的时间)就行了。上一个任务执行完毕5秒之后,下一个任务就会开始执行

@Component
public class TestScheduling {
    private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
    @Scheduled(fixedDelay=5000)
    public void myTask(){
        LOG.info("开始执行时间:{}",sdf.format(new Date()));
        try {
            Thread.sleep(8000);//让任务执行的耗时时间为8秒,有利于我们的观察
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LOG.info("执行完毕时间:{}",sdf.format(new Date()));
    }
}


3.initialDelay

用于配合fixedRate和fixedDelay使用的,作用是在容器启动后经过多长时间才开始执行第一次任务。

4.扩展一下

我们先看下一下@Scheduled注解里面有什么

 fixedDelayString、fixedRateString和initialDelayString不就是我们上面讲的三个加个字符串嘛,之前的三个都是long类型,这三个是String类型,顾名思义,不就是用字符串表示嘛。作用其实就是为了能在application.properties配置

@Component
public class TestScheduling {
    private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
    @Scheduled(initialDelay = 5000,fixedDelayString = "${com.liang.scheduled:5000}")
    public void myTask(){
        LOG.info("开始执行时间:{}",sdf.format(new Date()));
        try {
            Thread.sleep(8000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LOG.info("执行完毕时间:{}",sdf.format(new Date()));
    }
}
 :5000作用是防止application.properties没有配置com.liang.scheduled属性则使用默认的5000(如果没有写:5000且application.properties没有配置com.liang.scheduled属性会报异常)

执行结果:和我们预计的一样,下一次开始执行时间与上一次结束时间间隔正好是10秒。如果去掉application.properties中的com.liang.scheduled属性,则间隔时间是默认的5秒,这个自行验证。

第二种cron表达式

网站:http://cron.qqe2.com/

这个自行去网

备注:https://blog.csdn.net/qq_33643072/article/details/81334268

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值