springboot的定时任务学习——@Scheduled

目录

前言:

1.cron 表达式

1.1 每一个域可出现的字符 

1.2 关于定时任务的一些思考与用法

1.2.1 占位符

1.3 启动服务的时候就执行任务

1.4 fixedDelay和fixedDelayString

1.5 fixedRate和fixedRateString

1.6 initialDelay和initialDelayString

 


前言:

定时任务在项目中可以这样写

@Scheduled(cron = "0 0 2 * * ?")

但是具体什么意思呢?这是一种表达式

当然@Scheduled 还有别的用法

不过作为一个程序员,首先英文还是要专业点。

scheduled -----> [ˈskedʒuːld] (USA) 

1.cron 表达式

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 

1.Seconds Minutes Hours DayofMonth Month DayofWeek Year
2.Seconds Minutes Hours DayofMonth Month DayofWeek

其实就是

秒 分 时 日 月 周 年

但是日和周是有对立的,只有一个能有值,另一个应该为问号。

至于year 有没有都可以

(这边年的地方可以留空)

序号说明必填允许填写的值允许的通配符
10-59, - * /
20-59, - * /
30-23, - * /
41-31, - * ? / L W
51-12 / JAN-DEC, - * /
61-7 or SUN-SAT, - * ? / L #
71970-2099, - * /

1.1 每一个域可出现的字符 


Seconds: 可出现", - * /"四个字符,有效范围为0-59的整数 
Minutes: 可出现", - * /"四个字符,有效范围为0-59的整数 
Hours: 可出现", - * /"四个字符,有效范围为0-23的整数 
DayofMonth :可出现", - * / ? L W C"八个字符,有效范围为0-31的整数 
Month: 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc 
DayofWeek: 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推 
Year: 可出现", - * /"四个字符,有效范围为1970-2099年

每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是: 
(1) *:表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。

(2) ?:只能用在DayofMonth和DayofWeek两个域。DayofMonth和 DayofWeek会相互影响。

(就是这个DayofMonth和DayofWeek 这两个只能有一个有值,另外一个应该为问号。

有点像是对立事件)

(3) -:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次 

(4) /:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次. 

(5) , :表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。 

(6) L:就是Last的意思,只出现在DayofWeek和DayofMonth中。

如果L前面有具体的内容,比如6L就代表这个月的倒数第六天。

使用L的时候,不能使用范围。

(7) W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一 到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份。

(8) LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。 

(9) #:用于确定每个月第几个星期几,只能出现在DayofWeek域。(只能出现在周这里)

# 序号(表示每月的第几个周几),例如在周字段上设置”5#2”表示在每月的第2个周五

1.2 关于定时任务的一些思考与用法

定时任务其实是可以写到配置文件里面的,但是看有没有必要。

也就是定时任务中的cron表达式可以支持使用占位符来进行实现。

写在yml文件中,然后比如

scheduled:
  cron: 0 0 2 * * ?
  interval: 10

每5秒执行一次:

    @Scheduled(cron="${scheduled.cron}")
    //执行任务

    @Scheduled(cron="*/${scheduled.interval} * * * * *")
    //执行任务

有点类似于mybatis的那种占位符

1.2.1 占位符

  • 1)java中一种占位符是类似于c语言中的占位符,使用String类的format()方法

比如:

str=String.format("Hi,%s", "hehe");
System.out.println(str);

不过这种写法在java中真是很少见了。

  • 2)使用{}来当占位符,使用MessageFormat.format转换(不过这种在mybatis那种就是一样意思的占位符)
package com.middleware.study;

import java.text.MessageFormat;

/**
 * @Description : FormatTest
 * @Date : 2019/10/9
 * @Author : pmdream
 */
public class FormatTest {


    public static void main(String[] args) {
        String str = "我叫{0},今年{1}岁。";
        String name = "hehe";
        String age = "23";
        str = MessageFormat.format(str, name, age);
        System.out.println(str);
    }

}

结果如下:我叫hehe,今年23岁。

1.3 启动服务的时候就执行任务

实现InitializingBean,并且重写afterPropertiesSet

@Override
    public void afterPropertiesSet() throws Exception {
        this.init(); //进行定时任务初始化就可以了
    }

1.4 fixedDelay和fixedDelayString

上一次执行完成之后,经过多久再次执行;

这两个意思相同,只不过fixedDelayString 支持占位符,而且这个是字符串形式的(正因为是字符串所以支持~)

1.5 fixedRate和fixedRateString

觉得与fixedDelay类似

fixedRateString也是字符串形式,支持占位符

@Scheduled(fixedRate = 10000) //上一次开始执行时间点之后10秒再执行

1.6 initialDelay和initialDelayString

@Scheduled(initialDelay=10000, fixedRate=5000) //第一次延迟10秒后执行,之后按fixedRate 五秒执行一次

 

 

 

 

参考:(但是感觉这个博主有的例子举得都是有问题的,所以自己进行了修改)

https://www.cnblogs.com/dyppp/p/7498457.html

https://www.cnblogs.com/xiang--liu/p/11378860.html

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值