当前位置: 首页 > news >正文

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 注解启用定时任务调度。

@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 执行一次。
@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 秒执行一次,无论上一次任务是否完成,都会在指定的时间间隔后再次执行。
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {System.out.println("Fixed rate task executed at " + LocalDateTime.now());
}

3.3 fixedDelay 属性

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

4. Spring Task 定时任务案例

4.1 创建定时任务类

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

/*** 自定义定时任务类*/
@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 的默认时间配置在注解中直接设置,但也可以从配置文件读取定时任务的时间,增加动态配置的灵活性。

# application.properties
task.fixed-rate=5000
task.fixed-delay=5000
task.cron-expression=0 0 10 * * ?

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

/*** 自定义定时任务类*/
@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());}
}
http://www.lryc.cn/news/471766.html

相关文章:

  • Spring Boot 应用开发概述
  • Chrome谷歌浏览器加载ActiveX控件之allWebDesktop控件介绍
  • GitHub Star 数量前 5 的开源应用程序生成器
  • DBC文件当中新建CANFD等类型的报文
  • 基于SpringBoot的房地产销售管理系统【附源码】
  • 圆点虚线 Android
  • 贵州鑫宏远农业-始终致力于推动现代农业的科技创新与发展
  • 程序员做销售,从代码到客户的逆袭之路
  • Flink CDC系列之:理解学习Kubernetes模式
  • git合并相关操作详解
  • 前端经典【面试题】持续更新HTML、CSS、JS、VUE、FLUTTER、性能优化等
  • 【Linux知识】linux磁盘管理深入了解
  • Qt Essential Classes
  • 小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M
  • 软件测试学习笔记丨Selenium学习笔记:css定位
  • python数据处理常用操作
  • 解决minio跨域问题
  • python 跳过当前循环
  • 数据库数据恢复—Oracle ASM磁盘组掉线 ,ASM实例无法挂载的数据恢复案例
  • jupyter notebook改变默认启动路径
  • libevent源码剖析-基本数据结构
  • 往期文章汇总——射频测量+无线通信+软件无线电+6G科普
  • 微信小程序 - 深 / 浅拷贝实现方法,微信小程序深拷贝与浅拷贝,函数方法封装直接调用使用,深拷贝cloneDeep和浅拷贝clone(深复制和浅复制)
  • Log4Net配置详解及输出自定义消息类示例代码
  • C++在实际项目中的应用第二节:C++与区块链
  • 浅记React面试丢人时刻
  • Python入门:学会Python装饰器让你的代码如虎添翼!(Python如何不改动原有函数代码添加一些额外的功能)
  • 【C++】哈希冲突的解决办法:闭散列 与 开散列
  • 复刻系列-原神 5.1 版本先行展示页
  • STM32 第3章 如何用串口下载程序