Spring Task定时任务

任务调度

任务调度是为了让系统自动完成任务,在约定好的特定时刻去执行任务的过程

列如:

  • 在电商系统中需要在下午6点自动发送优惠卷
  • 订票系统中根据车次不同,不同时间段分批发票

实现任务调度方法

  1. 多线程方式,利用sleep
  2. JDK提供的API:列如Timer,ScheduledExecutor
  3. 列如Quartz
  4. spring task

Spring Task实现定时任务

SpringBoot默认在无任何第三方依赖的情况下使用spring-context 模块提供的定时任务工具spring Tack。我们只需要使用@EnableScheduling注解就可以开启相关的定时任务功能(实现类)

1.启动类添加注解

也就是说我们需要在启动类添加开启任务调度的注解(@EnableScheduling)

package com.zzyl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling  //开启任务调度
@EnableCaching
public class ZzylApplication {

	public static void main(String[] args) {
		SpringApplication.run(ZzylApplication.class, args);
	}
}

2.自定义定时任务类

package com.zzyl.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @author sjqn
 */
@Component
@Slf4j
public class MyTask {

    /**
     * 定时任务 每隔5秒触发一次
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void executeTask(){
        log.info("定时任务开始执行:{}", LocalDateTime.now());
    }
}

添加@Component注解受容器管理,注解@Scheduled()定义定时任务类

其中设计到了cron表达式

cron表达式

我们在设置时间频率的时候,通常情况下都会使用cron表达式来表达

cron表达式是一个字符串,用来设置定时规则,由其部分组成,每部分中间用空格隔开

组合部分 含义 取值范围
第一部分 Seconds(秒) 0-59
第二部分 Minutes(分) 0-59
第三部分 Hours(时) 0-23
第四部分 Day-of-Month(天) 1-31
第五部分 Month(月) 0-11
第六部分 Day-of-Week(星期) 1-7
第七部分 Year(年) 1970-2099

此外,cron表达式还可以包含一些特殊符号来设置更加灵活的定时规则

符号 含义
? 表示不确定的值,当两个子表达式其中一个被指定了值以后,为了避免冲突,需要将另外一个的值设为"?"。例如:想在每月20日触发调度,不管20号时星期几,只能用如下写法:0 0 0 20 * ? ,其中最后一位只能用"?"
* 代表所有可能的值
, 设置多个值,列如"26,29,33" 表示在26分,29分,33分各自运行一次任务
- 设置取值范围,列如"5-20",表示从5分到20分钟,每分钟运行一次任务
/ 设置频率或间隔,如"1/15"表示从1分开始,每隔15分种运行一次任务
L 用于每月,或每周,表示每月的最后一天,或每个月的最后星期几,列如"6L"表示每月的最后一个星期六
W 表示离给定日期最近的工作日,列如"15W"放在每月上表示离本月15日最近的工作日
# 表示该月第几个周X,列如"6#3"表示该月第三个周五

例子

cron表达式 含义
*/5 * * * * ? 每隔5秒运行一次任务
0 0 23 * * ? 每天23点运行一次任务
0 0 1 1 * ? 每月1号凌晨1点运行一次任务
0 0 23 L * ? 每月最后一天23点运行一次任务
0 26,29,33 * * * ? 在26分,29分,33分运行一次任务
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时运行一次任务
0 15 10 ? * 6#3 每月的第三个星期五上午10:15运行一次任务
posted @ 2024-01-25 20:57  奕帆卷卷  阅读(47)  评论(0编辑  收藏  举报