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());
    }
}
相关推荐
蜡笔小新星40 分钟前
Flask项目框架
开发语言·前端·经验分享·后端·python·学习·flask
夏天的味道٥4 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
Fantasywt4 小时前
THREEJS 片元着色器实现更自然的呼吸灯效果
前端·javascript·着色器
IT、木易5 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring
浪九天6 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
小斌的Debug日记7 小时前
框架基本知识总结 Day16
redis·spring
堕落年代7 小时前
Maven匹配机制和仓库库设置
java·maven
m0_748246877 小时前
maven导入spring框架
数据库·spring·maven