SpringBoot任务——定时任务


文章目录

  • SpringBoot任务——定时任务
  • 1.定时任务相关简介与注解
  • 2.定时任务使用场景
  • 3.cron表达式
  • 4.定时任务举例
  • 4.1 定时任务方法 注解@Scheduled(cron = "cron表达式")
  • 4.2 使用**@EnableScheduling**:标注在类上开启定时任务


1.定时任务相关简介与注解

使用定时任务,顾名思义就是使其在设置好的时间点执行相对应的操作。

在springboot中可使用以下两个注解使用定时任务:@Scheduled(cron = “0 * * * * *”)

  • @Scheduled(cron = “cron表达式”):标注于方法上,配置定时任务执行的时间规则
  • @EnableScheduling:标注在类上,开启定时任务

2.定时任务使用场景

比如每天/每周/每月生成日志汇总,定时发送推送信息,定时生成数据表格等

3.cron表达式

cron表达式由六个值组成,分别为几秒 几分 几时 几日 几月 周几 用空格隔开

以下两表格来自: https://www.bilibili.com/video/av38657363?p=96 表格二适当加了举例

cron表达式中7个字段的说明:默认为6个

字段

取值范围

允许的特殊字符


0-59

,-*/


0-59

,-*/

小时

0-23

,-*/


1-31

,-*/?LWC


1-12

,-*/

星期

0-7或SUN-SAT(0和7都是SUN)

,-*/?LC#

年(可选)

默认1970-2099

, - * /

cron表达式特殊字符说明:

特殊字符

含义

举例

,

枚举,

0,6,8,57 * * * * * 秒钟为0/6/8/57秒时执行

-

区间

25-35 * * * * * 秒钟为25至35秒时执行

*

任意

3 3 3 * * * 每天的3点3分3秒执行

/

步长,

0/5 * * * * * 每隔5秒执行

?

日/星期冲突匹配

0 0 0 ?5 MON 五月的每周一0点0分0秒执行

L

最后

0 0 0 ?* 1L 每月的最后一个周一的0点0分0秒执行

#

第几个

0 0 0 ? * 5#2 每个月的第二个周五的0点0分0秒执行

4.定时任务举例

4.1 定时任务方法 注解@Scheduled(cron = “cron表达式”)

这里写几个demo,他们的执行效果放在注释当中了。

/**
 * Springboot任务——定时任务
 */
@Service
public class ScheduledService {

    /**
     * Scheduled注解中cron = ""指定cron表达式
     * cron表达式中的六个值依次为:
     * 几秒 几分 几时 几日 几月 周几 (用空格隔开)
     * 范围分别为:
     * 0-59 0-59 0-23 1-31 1-12 0-7(0和7都是周日)
     * 例子:0 * * * * MON-SUN 整秒执行如 2020/2/28 17:45:00
     */

    //*代表任意
    @Scheduled(cron = "0 * * * * *")
    public void testScheduled() {
        Date t = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //System.out.println("整秒执行"+df.format(t));
    }
    //整秒执行2020-02-28 16:46:00
    //整秒执行2020-02-28 16:47:00
    //整秒执行2020-02-28 16:48:00
    //整秒执行2020-02-28 16:49:00

    // /代表步长 0/5每隔5秒执行
    @Scheduled(cron = "0/5 * * * * *")
    public void testScheduled2() {
        Date t = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //System.out.println("测试步长符号/ 每5s执行"+df.format(t));
    }
    //测试步长符号/ 每5s执行2020-02-28 16:50:10
    //测试步长符号/ 每5s执行2020-02-28 16:50:15
    //测试步长符号/ 每5s执行2020-02-28 16:50:20
    //测试步长符号/ 每5s执行2020-02-28 16:50:25

    // - 代表区间 ,代表枚举 10-15,20-25表示10-15s执行且20-25s执行
    @Scheduled(cron = "10-15,20-25 * * * * *")
    public void testScheduled3() {
        Date t = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //System.out.println("测试区间符号-和枚举符号, 10-15s执行且20-25s执行"+df.format(t));
    }
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:10
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:11
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:12
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:13
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:14
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:15
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:20
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:21
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:22
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:23
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:24
    //测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:25

    @Scheduled(cron = "0 0 2 LW * ?")
    public void testScheduled4() {
        Date t = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("测试工作日符号W"+df.format(t));
    }


}
4.2 使用**@EnableScheduling**:标注在类上开启定时任务

我这里标注在启动类上了:

@EnableScheduling//开启定时任务
@SpringBootApplication
public class SpringbootTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootTaskApplication.class, args);
    }
}