一. 介紹
Spring Task 是Spring框架提供的任務調度工具,可以按照約定的時間自動執行某個代碼邏輯,無需依賴額外組件(如 Quartz),配置簡單、使用便捷,適合處理周期性執行的任務(如定時備份數據、定時發送報表、定時清理緩存等)。
1. 核心特點:
- 輕量級:屬于 Spring 框架自帶模塊,無需額外引入依賴(Spring 3.0+ 已內置)。
- 易用性:通過注解(如?
@Scheduled
)即可快速配置定時任務,無需復雜 XML 配置。 - 支持多種調度策略:可按固定速率、固定延遲、Cron 表達式等方式觸發任務。
- 與 Spring 生態無縫集成:能直接注入 Spring 容器中的 Bean,方便使用業務邏輯組件。
2.應用場景:
- 每日凌晨凌晨 2 點自動備份數據庫
- 每小時清理過期緩存數據
- 每天 8 點推送用戶消息通知
- 每周一生成上周銷售報表
- 每 10 分鐘檢查并提醒即將超時的訂單
- 每月 1 日刪除 3 個月前的無效訂單
- 每 5 分鐘監控服務器運行狀態
- 每天凌晨預熱熱門商品緩存數據
二. corn表達式
要使用Spring Task,必須學會corn表達式。
Cron 表達式是用于定義定時任務執行時間的字符串格式,由 6 或 7 個空格分隔的字段組成,分別代表不同的時間單位,基本格式如下(從左到右):
秒 分 時 日 月 周 [年]
(年是可選字段,通常省略)
常用特殊字符含義
*
:匹配所有值(如 “分” 字段為?*
?表示每分鐘)?
:僅用于 “日” 和 “周”,表示不指定具體值(避免兩者沖突)/
:表示遞增(如?0/5
?表示從 0 開始,每 5 單位執行一次)-
:表示范圍(如?10-12
?表示 10 到 12),
:表示多個值(如?MON,WED,FRI
?表示周一、三、五)
常見示例
0 0 2 * * ?
?→ 每天凌晨 2 點執行0 0 8,18 * * ?
?→ 每天 8 點和 18 點執行0 0/30 9-17 * * ?
?→ 工作日 9 點到 17 點,每 30 分鐘執行0 0 12 ? * WED
?→ 每周三中午 12 點執行0 0 1 1 * ?
?→ 每月 1 日凌晨 1 點執行0/5 * * * * ?
?→ 每 5 秒執行一次0 30 10 ? * MON-FRI
?→ 工作日上午 10 點 30 分執行
三. 使用步驟
1. 導入maven坐標
Spring Task 是 Spring Framework 核心模塊的一部分,不需要單獨引入額外的 Maven 坐標。它包含在 Spring 核心依賴中,只要項目中引入了 Spring Context 相關依賴(幾乎所有 Spring 項目都會包含),就可以直接使用 Spring Task 的功能。
最常見的引入方式是通過 Spring Boot starter 間接包含,例如:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><!-- 版本號通常由 Spring Boot 父工程統一管理 -->
</dependency>
2. 在啟動類上添加注解@EnableScheduling開啟任務調度
@SpringBootApplication
@Slf4j
@EnableScheduling//開啟任務調度
public class SkyApplication {public static void main(String[] args) {SpringApplication.run(SkyApplication.class, args);log.info("server started");}
}
3. 自定義定時任務類
這里寫一個簡單的例子:
/*** 自定義定時任務類*/
@Component
@Slf4j
public class Mytask {/*** 定時任務 每五秒執行一次*/@Scheduled(cron = "0/5 * * * * ?")public void task(){log.info("定時任務開始執行:{}", new Date());}
}
注解:
@Component
:將該類注冊到 Spring 容器中,使其成為被管理的 Bean。@Slf4j
:Lombok 提供的注解,自動生成日志對象?log
,用于打印日志。@Scheduled(cron = "0/5 * * * * ?")
:核心注解,通過 Cron 表達式?0/5 * * * * ?
?指定任務執行規則
方法task:任務執行的具體邏輯,可以將這里替換為需要定時處理的業務