您的当前位置:首页正文

Spring定时任务scheduled

2024-11-29 来源:个人技术集锦

Spring定时任务

一. cron 表达式

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

2. Cron表达式结构:Cron 从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

3. 在线生成cron表达式:http://cron.qqe2.com/

4. Cron各字段含义

注意:星期和日是冲突的,因此有星期数了,就不能有日

通用符号:,- * /
, :  表示枚举值。例如:在Minuttes域使用5,20,表示在时间的分钟数为5,20时触发事件
- : 表示范围。例如在Minutes域使用5-20,表示在时间的分钟数为5-20时每分钟都触发事件
* : 表示匹配该域的任意值,假如在Minutes域使用,表示时间分数不做限制。没分钟都触发
/ :  表示其实开始时间触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,表示分钟数为5时触发一次,后隔20分钟即25,45再分别触发一次事件。

eg:  0 0 2 1 * ?     //表示每个月的1号的2点执行
eg: 0 10,44 143 WED  //在每年的3月份星期三的14点的10分和44分0秒执行一次

专有符号:
?: 只能使用在DayofMonthDayofWeek两个域,由于DayofMonthDayofWeek互斥,必须对其一设置
L:  表示最后,只能出现在DayofWeekDayofMonth域,如果DayofWeek域使用5L(从星期日计数),意味着在最后的一个星期四触发。
w:   表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在指定日期的最近有效工作日触发事件。
    
eg:  5w //表示在每个月的5号的最近的一个工作日执行
    
LW:  这两个可以连用,表示在某个月最后一个工作日
#;  用于确定每个月星期几,只能出现在DayofWeek域,例如4#2表示在每个月的第二个星期三执行
注意:专用符号除了?之外,spring都不支持
5. Demo
*/2 * * * * ?0/2 * * * * ?       //每两秒执行一次
0 0 1 1 * ? *                        //每月的1日的凌晨1点执行
0 0 9,12,17 * * ?                    //每天上午9点,下午12点,17点执行
0 10 12 * * ?0 10 12 ? * *0 10 12 * * ? *  //每天上午12:10执行
0 30 1 L * ?                         //每月最后一日的凌晨1:30执行
0 0 12 ? * WED                       //每周三中午12点执行

二. spring定时任务步骤

1. 创建一个springBoot工程
2. 在启动类上加上加上@EnableScheduling注解
//开启支持定时任务
@EnableShceduling
3. 在需要执行定时任务的方法上加上@Scheduled注解并加上cron表达式
package com.itheima.reggie;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
//开始支持定时任务功能
@EnableScheduling
//启动类
@SpringBootApplication
//打印日志
@Slf4j
public class ReggieApplication {
    public static void main(String[] args) {
        SpringApplication.run(ReggieApplication.class,args);
        log.info("》》》》》》》》》》》》》》》》》》项目启动成功《《《《《《《《《《《《《《《《《《《");
    }
    @Scheduled(cron = "* * 8,12,19 * * ? ")
    public void takeMedicine(){
        log.info("该吃药了.................");
    }

    @Scheduled(cron = "* * 0/2 * * ? *")
    public void drinkWater(){
        log.info("该喝水了...............");
    }
}
显示全文