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());
    }
}
相关推荐
肥肥呀呀呀27 分钟前
在Flutter上如何实现按钮的拖拽效果
前端·javascript·flutter
小雅痞31 分钟前
[Java][Leetcode middle] 55. 跳跃游戏
java·leetcode
com未来37 分钟前
使用 NSSM 安装 Tomcat 11.0.6 为 Windows 服务
java·windows·tomcat
TDengine (老段)43 分钟前
基于 TSBS 标准数据集下 TimescaleDB、InfluxDB 与 TDengine 性能对比测试报告
java·大数据·开发语言·数据库·时序数据库·tdengine·iotdb
Zero10171343 分钟前
【React的useMemo钩子详解】
前端·react.js·前端框架
养军博客44 分钟前
spring boot3.0自定义校验注解:文章状态校验示例
java·前端·spring boot
lgily-12251 小时前
常用的设计模式详解
java·后端·python·设计模式
IT成长史1 小时前
deepseek梳理java高级开发工程师微服务面试题
java·微服务
茶本无香1 小时前
Feign+Resilience4j实现微服务熔断机制:原理与实战
java·微服务·feignclient·熔断·resilience4j
遇见火星1 小时前
Ansible模块——从控制节点向目标主机复制文件!
java·服务器·ansible