Spring Task(定时任务)框架

文章目录

  • 一、Spring Task介绍
  • 二、cron表达式
    • 1.cron表达式介绍
    • 2.cron表达式在线生成器
  • 三、fixedDelay
  • 四、fixedRate
  • 五、initialDelay
  • 六、Spring Task的使用
    • 1.导入maven坐标spring-context
    • 2.启动类添加注解@EnableScheduling开启任务调度
    • 3.自定义定时任务类


一、Spring Task介绍

Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。
Spring Task(定时任务)框架_第1张图片
应用场景:

  • 信用卡每月还款提醒
  • 银行贷款每月还款提醒
  • 火车票售票系统处理未支付订单
  • 入职纪念日为用户发送通知
  • 等等…
    (只要是需要定时处理当达到场景都可以使用Spring Task)

二、cron表达式

1.cron表达式介绍

cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发时间
构成规则:分成6或7个域(位置),由空格分隔开,每个域代表一个含义
每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)
举例:
Spring Task(定时任务)框架_第2张图片
其中日和周是两个相互对立的,当一个定义为数字后,另一个定义为 ?
Spring Task(定时任务)框架_第3张图片

2.cron表达式在线生成器

网址:https://cron.qqe2.com/
Spring Task(定时任务)框架_第4张图片
这里需要了解一些cron的相关语法规范。

特殊字符介绍:
逗号(,):指定一个值列表,例如使用在月域上1,4,5,7表示1月、4月、5月和7月

横杠(-):指定一个范围,例如在时域上3-6表示3点到6点(即3点、4点、5点、6点)

星号(*):表示这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发

斜线(/):表示递增,例如使用在秒域上0/15表示每15秒

问号(?):只能用在日和周域上,但是不能在这两个域上同时使用。表示不指定

井号(#):只能使用在周域上,用于指定月份中的第几周的哪一天,例如6#3,意思是某月的第三个周五 (6=星期五,3意味着月份中的第三周)

L:某域上允许的最后一个值。只能使用在日和周域上。当用在日域上,表示的是在月域上指定的月份的最后一天。用于周域上时,表示周的最后一天,就是星期六

W:W 字符代表着工作日 (星期一到星期五),只能用在日域上,它用来指定离指定日的最近的一个工作日

三、fixedDelay

它的间隔时间是根据上次的任务结束的时候开始计时的,只要盯紧上一次执行结束的时间即可,跟任务逻辑的执行时间无关,两个轮次的间隔距离是固定的。
Spring Task(定时任务)框架_第5张图片

四、fixedRate

这个相对难以理解一些。在理想情况下,下一次开始和上一次开始之间的时间间隔是一定的。但是默认情况下 Spring Boot 定时任务是单线程执行的。当下一轮的任务满足时间策略后任务就会加入队列,也就是说当本次任务开始执行时下一次任务的时间就已经确定了,由于本次任务的“超时”执行,下一次任务的等待时间就会被压缩甚至阻塞,看图就明白了。
Spring Task(定时任务)框架_第6张图片

五、initialDelay

初始化延迟时间,也就是第一次延迟执行的时间。这个参数对 cron 属性无效,只能配合 fixedDelay 或 fixedRate 使用。如 @Scheduled(initialDelay=5000,fixedDelay = 1000) 表示第一次延迟 5000 毫秒执行,下一次任务在上一次任务结束后 1000 毫秒后执行。

六、Spring Task的使用

1.导入maven坐标spring-context

代码如下(示例):

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
</dependency>

Spring Task(定时任务)框架_第7张图片

2.启动类添加注解@EnableScheduling开启任务调度

代码如下(示例):

@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching//开启缓存注解功能
@EnableScheduling //开启任务调度
public class SkyApplication {
    public static void main(String[] args) {
        SpringApplication.run(SkyApplication.class, args);
        log.info("server started");
    }
}

Spring Task(定时任务)框架_第8张图片

3.自定义定时任务类

举例代码:

/**
 * 自定义定时任务类
 */

@Component //当前类需要实例化,交给spring管理,所以加@Component
@Slf4j
public class MyTask {

    /**
     * 定时任务 每隔5秒触发一次
     */
    @Scheduled(cron = "0/5 * * * * ?") //指定任务什么时候触发
    public void executeTask(){
        log.info("定时任务开始执行:{}",new Date());
        /**
         * 定时任务的一些任务逻辑
         */
    }

}

执行结果:
Spring Task(定时任务)框架_第9张图片

你可能感兴趣的:(Java,spring,java)