Spring Task—定时任务

Spring Task 是 Spring 提供的一种轻量级定时任务调度功能,内置在 Spring 框架中。与 Quartz 等重量级调度框架相比,Spring Task 使用简便,无需额外依赖,适合在简单的调度任务场景中使用。通过注解配置方式,开发者可以快速实现周期性任务执行,非常适合 Spring Boot 项目中的定时任务需求。

1. 介绍

Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

  • 简介:Spring Task 提供了 @Scheduled 注解,通过此注解可以为方法添加定时任务,实现任务调度。
  • 使用场景:需要定时处理的场景都可以使用Spring Task 。
  • 主要特性
    • 简单配置:只需简单的注解配置,使用方便。
    • 支持多种时间表达式:支持固定速率执行、固定延迟执行和 Cron 表达式调度。
    • 灵活性:可配合 Spring Boot 的配置文件,实现动态任务调度。

2. 使用步骤

2.1 引入依赖

Spring Task 是 Spring 框架的内置功能,在 Spring Boot 项目中无需额外依赖,仅需在主启动类中启用定时任务。

2.2 启用定时任务

在 Spring Boot 项目主启动类中,通过 @EnableScheduling 注解启用定时任务调度。

java 复制代码
@SpringBootApplication
@EnableScheduling  // 启用定时任务功能
public class TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class, args);
    }
}

2.3 使用 @Scheduled 注解定义定时任务

@Scheduled 注解用于声明一个方法为定时任务,可以配置不同的时间策略:

  • fixedRate:以固定频率执行,任务开始到下次任务开始的时间间隔固定,单位为毫秒。
  • fixedDelay:以固定延迟执行,任务结束到下次任务开始的时间间隔固定,单位为毫秒。
  • cron:使用 Cron 表达式,支持更精细的调度。

3. @Scheduled 注解的属性详解

3.1 cron 属性

cron表达式在线生成器:在线Cron表达式生成器

ron表达式 其实就是一个字符串,通过cron表达式可以定义任务触发的时间

**构成规则:**分为6或7个域,由空格分隔开,每个域代表一个含义

  • 作用:使用 Cron 表达式来控制任务的执行时间,支持精确的时间控制。
  • Cron 表达式结构秒 分 时 日 月 星期 [年]
  • 示例:任务在每天上午 10:00 执行一次。
java 复制代码
@Scheduled(cron = "0 0 10 * * ?")
public void cronTask() {
    System.out.println("Cron task executed at " + LocalDateTime.now());
}
  • *:表示任意值,例如 * 表示每分钟。
  • ?:仅用于"日"和"星期"字段,表示不指定具体的值。
  • -:表示范围,如 10-12 表示 10 点到 12 点。
  • ,:表示列出多个值,如 MON,WED,FRI 表示星期一、三、五。
  • /:表示增量,如 0/5 表示从 0 开始每隔 5 个单位。
  • L:用于"日"和"星期"字段,表示最后一天或最后一个星期几。
  • W:用于"日"字段,表示离指定日期最近的工作日。
  • #:用于"星期"字段,表示第几个星期几,如 4#2 表示每月第 2 个星期三。

说明: 一般的值不同时设置,其中一个设置,另一个用?表示。

3.2 fixedRate 属性

  • 作用:设置任务的固定频率(单位:毫秒),任务开始到下次任务开始的时间间隔固定。
  • 示例:任务每隔 5 秒执行一次,无论上一次任务是否完成,都会在指定的时间间隔后再次执行。
java 复制代码
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {
    System.out.println("Fixed rate task executed at " + LocalDateTime.now());
}

3.3 fixedDelay 属性

  • 作用:设置任务的固定延迟(单位:毫秒),上一次任务结束到下次任务开始的时间间隔固定。
  • 示例:任务在上一次任务结束后延迟 5 秒再执行一次。
java 复制代码
@Scheduled(fixedDelay = 5000)
public void fixedDelayTask() {
    System.out.println("Fixed delay task executed at " + LocalDateTime.now());
}

4. Spring Task 定时任务案例

4.1 创建定时任务类

MyTask中定义各种类型的定时任务方法,使用 @Scheduled 注解指定任务的执行策略。

java 复制代码
/**
 * 自定义定时任务类
 */
@Component
@Slf4j
public class MyTask{

    // 每5秒执行一次任务
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() {
        System.out.println("Fixed rate task executed at " + LocalDateTime.now());
    }

    // 上一次任务结束后延迟5秒再执行任务
    @Scheduled(fixedDelay = 5000)
    public void fixedDelayTask() {
        System.out.println("Fixed delay task executed at " + LocalDateTime.now());
    }

    // 每天上午10:00执行任务
    @Scheduled(cron = "0 0 10 * * ?")
    public void cronTask() {
        System.out.println("Cron task executed at " + LocalDateTime.now());
    }
}

4.2 配置动态化定时任务时间

Spring Task 的默认时间配置在注解中直接设置,但也可以从配置文件读取定时任务的时间,增加动态配置的灵活性。

java 复制代码
# application.properties
task.fixed-rate=5000
task.fixed-delay=5000
task.cron-expression=0 0 10 * * ?

MyTask中使用 @Value 注解读取配置文件中的值。

java 复制代码
/**
 * 自定义定时任务类
 */
@Component
@Slf4j
public class MyTask{

    @Scheduled(fixedRateString = "${task.fixed-rate}")
    public void fixedRateTask() {
        System.out.println("Dynamic fixed rate task executed at " + LocalDateTime.now());
    }

    @Scheduled(fixedDelayString = "${task.fixed-delay}")
    public void fixedDelayTask() {
        System.out.println("Dynamic fixed delay task executed at " + LocalDateTime.now());
    }

    @Scheduled(cron = "${task.cron-expression}")
    public void cronTask() {
        System.out.println("Dynamic cron task executed at " + LocalDateTime.now());
    }
}
相关推荐
暮湫3 分钟前
泛型(2)
java
南宫生12 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石20 分钟前
12/21java基础
java
高山我梦口香糖28 分钟前
[react]searchParams转普通对象
开发语言·前端·javascript
李小白6628 分钟前
Spring MVC(上)
java·spring·mvc
m0_7482352431 分钟前
前端实现获取后端返回的文件流并下载
前端·状态模式
GoodStudyAndDayDayUp41 分钟前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗1 小时前
常用类晨考day15
java
骇客野人1 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言