最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringTask快速入門最佳實踐記錄

 更新時間:2025年08月21日 10:49:10   作者:凜冬君主  
Spring Task是Spring框架自帶的任務調(diào)度工具,基于JDK 的ScheduledExecutorService實現(xiàn),提供了注解驅(qū)動的定時任務配置方式,今天這篇文章,我們就來全面學習Spring Task的使用方法和進階技巧,感興趣的朋友一起看看吧

在日常開發(fā)中,定時任務是一個非常常見的需求:比如定時清理日志、定時發(fā)送郵件、定時更新緩存、日常有每月的話費余額、貸款催件等。作為 Spring 生態(tài)的一員,Spring Task 提供了輕量級的定時任務解決方案,無需引入額外依賴,就能快速集成到 Spring 項目中。今天這篇文章,我們就來全面學習 Spring Task 的使用方法和進階技巧。

一、什么是 Spring Task?

Spring Task 是 Spring 框架自帶的任務調(diào)度工具,基于 JDK 的 ScheduledExecutorService 實現(xiàn),提供了注解驅(qū)動的定時任務配置方式。它的核心優(yōu)勢在于:

  • 輕量級:無需額外引入依賴(Spring 核心模塊已包含)
  • 易用性:通過簡單注解即可定義定時任務
  • 靈活性:支持固定延遲、固定頻率、Cron 表達式等多種調(diào)度方式

相比傳統(tǒng)的 Timer 或 Quartz,Spring Task 更適合中小型項目的單機定時任務場景,配置簡單且能滿足大部分基礎需求。

二、Spring Task 快速入門

1. 環(huán)境準備

Spring Task 已集成在 spring-context 模塊中,如果你使用 Spring Boot 項目,只需確保引入了 Spring Boot 基礎依賴即可:

<!-- Spring Boot 基礎依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.7.0</version> <!-- 根據(jù)實際版本選擇 -->
</dependency>

2. 開啟定時任務支持

在 Spring Boot 啟動類或配置類上添加 @EnableScheduling 注解,即可開啟定時任務功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 關鍵注解:開啟定時任務支持
public class TaskDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskDemoApplication.class, args);
    }
}

3. 定義第一個定時任務

創(chuàng)建一個組件類,使用 @Scheduled 注解標注定時任務方法。注意:

  • 方法返回值必須為 void
  • 方法不能有參數(shù)
  • 類需要被 Spring 容器管理(添加 @Component 等注解)
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class FirstTask {
    // 每 2 秒執(zhí)行一次
    @Scheduled(fixedRate = 2000)
    public void simpleTask() {
        System.out.println("定時任務執(zhí)行時間:" + LocalDateTime.now() + ",線程名稱:" + Thread.currentThread().getName());
    }
}

啟動項目后,控制臺會每隔 2 秒輸出一次日志,說明定時任務已生效!

三、@Scheduled 注解的四種使用方式

@Scheduled 注解提供了多種配置方式,滿足不同的調(diào)度需求,我們逐一介紹:

1. 固定延遲執(zhí)行(fixedDelay)

定義:上一次任務執(zhí)行結束后,延遲指定時間再執(zhí)行下一次任務。
適用場景:任務執(zhí)行時間不確定,但需要保證任務執(zhí)行間隔(如依賴上一次結果的任務)。

// 上一次任務結束后,延遲 1 秒執(zhí)行下一次
@Scheduled(fixedDelay = 1000) // 單位:毫秒
public void fixedDelayTask() {
    System.out.println("固定延遲任務執(zhí)行:" + LocalDateTime.now());
    try {
        // 模擬任務執(zhí)行耗時
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

2. 固定頻率執(zhí)行(fixedRate)

定義:按固定時間間隔執(zhí)行任務,不管上一次任務是否完成。
適用場景:任務執(zhí)行時間較短,需要保證執(zhí)行頻率(如定時拉取數(shù)據(jù))。

// 每 3 秒執(zhí)行一次(無論上一次是否完成)
@Scheduled(fixedRate = 3000)
public void fixedRateTask() {
    System.out.println("固定頻率任務執(zhí)行:" + LocalDateTime.now());
    try {
        Thread.sleep(1000); // 模擬耗時
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

?? 注意:如果任務執(zhí)行時間超過間隔時間,下一次任務會立即執(zhí)行(不會丟失),可能導致線程堆積,需謹慎使用。

3. 初始延遲執(zhí)行(initialDelay)

定義:項目啟動后,延遲指定時間再執(zhí)行第一次任務,后續(xù)按固定頻率 / 延遲執(zhí)行。
適用場景:需要項目初始化完成后再執(zhí)行的任務(如等待數(shù)據(jù)庫連接建立)。

// 項目啟動后延遲 5 秒執(zhí)行第一次,之后每 4 秒執(zhí)行一次
@Scheduled(initialDelay = 5000, fixedRate = 4000)
public void initialDelayTask() {
    System.out.println("初始延遲任務執(zhí)行:" + LocalDateTime.now());
}

4. Cron 表達式執(zhí)行(cron)

定義:通過 Cron 表達式定義復雜的時間規(guī)則,是最靈活的調(diào)度方式。
適用場景:需要按日歷規(guī)則執(zhí)行的任務(如每天凌晨 2 點執(zhí)行、每周一上午 10 點執(zhí)行)。

// 每分鐘的第 0 秒執(zhí)行(即每分鐘執(zhí)行一次)
@Scheduled(cron = "0 * * * * *")
public void cronTask() {
    System.out.println("Cron 任務執(zhí)行:" + LocalDateTime.now());
}

四、Cron 表達式詳解

Cron 表達式是定時任務的 “靈魂”,掌握它能讓你配置出任意復雜度的時間規(guī)則。

基本格式

Cron 表達式格式為:秒 分 時 日 月 周 [年](年可選,通常省略),每個位置代表不同的時間單位:

位置時間單位允許值范圍特殊字符
00-59, - * /
10-59, - * /
20-23, - * /
31-31, - * / ? L W C
41-12 或 JAN-DEC, - * /
51-7 或 SUN-SAT, - * / ? L C #
6年(可選)1970-2099, - * /

特殊字符含義

字符含義
*匹配所有值(如 “*” 在分時位表示每分鐘 / 小時)
?僅用于 “日” 和 “周” 位,代表 “無指定值”(避免日和周沖突)
-表示范圍(如 “10-12” 在時位表示 10、11、12 點)
,表示多個值(如 “MON,WED,FRI” 在周位表示周一、周三、周五)
/表示步長(如 “0/5” 在秒位表示每 5 秒執(zhí)行一次)
L表示最后(如 “L” 在日位表示當月最后一天;“5L” 在周位表示當月最后一個周五)
W表示最近工作日(如 “15W” 在日位表示當月 15 日最近的工作日)
#表示第幾個周幾(如 “6#3” 在周位表示當月第 3 個周六,6 代表周六)

常用 Cron 表達式示例

需求描述Cron 表達式
每天凌晨 2 點執(zhí)行0 0 2 * * ?
每天上午 8:30 執(zhí)行0 30 8 * * ?
每周一至周五 12:00 執(zhí)行0 0 12 ? * MON-FRI
每月 1 日凌晨 3 點執(zhí)行0 0 3 1 * ?
每 5 分鐘執(zhí)行一次0 0/5 * * * ?
每天 14:00-14:59 每 10 分鐘執(zhí)行0 0/10 14 * * ?
每年 1 月 1 日 00:00 執(zhí)行0 0 0 1 1 ?

編寫cron表達式可以用現(xiàn)成的網(wǎng)站:

在線Cron表達式生成器 https://cron.qqe2.com/

五、進階配置:并行執(zhí)行定時任務

默認情況下,Spring Task 的所有定時任務都在同一個線程中執(zhí)行,這意味著如果一個任務執(zhí)行時間過長,會阻塞其他任務。為了避免這種情況,我們可以配置線程池實現(xiàn)并行執(zhí)行。

配置 TaskScheduler

創(chuàng)建一個配置類,定義 TaskScheduler Bean,指定線程池大?。?/p>

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class TaskConfig {
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5); // 線程池大小
        scheduler.setThreadNamePrefix("task-scheduler-"); // 線程名稱前綴
        scheduler.setAwaitTerminationSeconds(60); // 關閉時等待時間
        scheduler.setWaitForTasksToCompleteOnShutdown(true); // 關閉時等待任務完成
        return scheduler;
    }
}

配置后,定時任務會在不同線程中執(zhí)行,通過日志的線程名稱可以觀察到變化:

plaintext

定時任務執(zhí)行時間:2023-10-01T10:00:00,線程名稱:task-scheduler-1
定時任務執(zhí)行時間:2023-10-01T10:00:02,線程名稱:task-scheduler-2

六、注意事項與最佳實踐

任務方法規(guī)范

  • 必須是無返回值(void)的方法
  • 不能有入?yún)ⅲㄈ粜枰獏?shù),可通過依賴注入獲?。?/li>

避免長時間阻塞

  • 單個任務執(zhí)行時間不宜過長,必要時拆分任務
  • 結合線程池配置,避免單線程阻塞導致所有任務延遲

分布式環(huán)境問題

  • Spring Task 不支持分布式鎖,集群部署時會導致任務重復執(zhí)行
  • 解決方案:集成 Redis 分布式鎖、使用 Quartz 或 XXL-Job 等分布式任務框架

任務異常處理

@Scheduled(fixedRate = 2000)
public void taskWithException() {
    try {
        // 業(yè)務邏輯
    } catch (Exception e) {
        // 異常處理:日志記錄、告警等
        log.error("任務執(zhí)行異常", e);
    }
}
  • 定時任務中若發(fā)生未捕獲異常,會導致任務終止且不會自動恢復

建議在任務方法中添加全局異常捕獲:

時間精度問題

  • Spring Task 基于 JVM 時間,若服務器時間同步異常,會導致任務執(zhí)行偏差
  • 建議開啟服務器時間同步(如 NTP 服務)

七、總結

Spring Task 作為 Spring 生態(tài)的輕量級定時任務工具,以其簡單易用、配置靈活的特點,成為中小型項目單機定時任務的首選方案。通過本文的學習,你已經(jīng)掌握了:

  • Spring Task 的基本使用和核心注解
  • 四種任務調(diào)度方式(fixedDelay、fixedRate、initialDelay、Cron)
  • Cron 表達式的語法和常用示例
  • 線程池配置與并行執(zhí)行技巧
  • 實際開發(fā)中的注意事項和最佳實踐

到此這篇關于SpringTask入門的文章就介紹到這了,更多相關SpringTask入門內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java調(diào)用Redis集群代碼及問題解決

    Java調(diào)用Redis集群代碼及問題解決

    這篇文章主要介紹了Java調(diào)用Redis集群代碼及問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Gson中的TypeToken與泛型擦除詳情

    Gson中的TypeToken與泛型擦除詳情

    這篇文章主要介紹了Gson中的TypeToken與泛型擦除詳情,其Gson類提供了toJson()與fromJson()方法,分別用來序列化與反序列化,更多相關內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • idea項目文件夾橫向顯示,縱向顯示的解決方法

    idea項目文件夾橫向顯示,縱向顯示的解決方法

    這篇文章主要介紹了idea項目文件夾橫向顯示,縱向顯示的解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java IO之字節(jié)輸入輸出流詳解

    Java IO之字節(jié)輸入輸出流詳解

    這篇文章主要為大家介紹了Java IO之字節(jié)輸入輸出流,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • SpringBoot+Redis實現(xiàn)分布式緩存的方法步驟

    SpringBoot+Redis實現(xiàn)分布式緩存的方法步驟

    在高并發(fā)的分布式的系統(tǒng)中,緩存是提升系統(tǒng)性能的重要手段,本文主要介紹了SpringBoot+Redis實現(xiàn)分布式緩存的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Jackson自定義序列化與反序列化注解詳解

    Jackson自定義序列化與反序列化注解詳解

    這篇文章主要介紹了Jackson自定義序列化與反序列化注解詳解,某些場景下,我們使用Jackson對數(shù)據(jù)進行序列化或反序列化的時候,需要對某些數(shù)據(jù)進行特殊處理,需要的朋友可以參考下
    2023-11-11
  • 解決RabbitMq queue異常導致consumer停止問題

    解決RabbitMq queue異常導致consumer停止問題

    該問題為RabbitMQ隊列異常導致消費者停止消費,錯誤碼404表示隊列不存在或broker不允許使用該隊列,原因可能為RabbitMQ服務異?;蚺渲脝栴},建議檢查RabbitMQ服務狀態(tài),確認隊列名稱正確,并適當調(diào)整消費者重試策略
    2026-05-05
  • SpringCloud LoadBalancer自定義負載均衡器使用解析

    SpringCloud LoadBalancer自定義負載均衡器使用解析

    LoadBalancerClient 是 SpringCloud 提供的一種負載均衡客戶端,Ribbon 負載均衡組件內(nèi)部也是集成了 LoadBalancerClient 來實現(xiàn)負載均衡,本文給大家深入解析 LoadBalancerClient 接口源碼,感興趣的朋友跟隨小編一起看看吧
    2023-04-04
  • SpringBoot中多環(huán)境啟動配置的教程詳解

    SpringBoot中多環(huán)境啟動配置的教程詳解

    在SpringBoot項目的生命周期中,存在不同的環(huán)境,我們就需要針對不同環(huán)境制定不同名稱的配置文件,里面放置不同環(huán)境下所需的配置項,下面小編就來和大家詳細講講SpringBoot如何進行多環(huán)境啟動配置的吧
    2024-02-02
  • Spring?Boot3?跨域配置?Cors的方式

    Spring?Boot3?跨域配置?Cors的方式

    這篇文章主要介紹了Spring?Boot3?跨域配置?Cors,通過使用CORS,開發(fā)人員可以控制哪些外部網(wǎng)頁可以訪問他們的資源,從而提高應用程序的安全性,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-01-01

最新評論

新巴尔虎左旗| 上林县| 项城市| 琼海市| 烟台市| 双流县| 霍州市| 和硕县| 镇安县| 亚东县| 田东县| 清涧县| 榆树市| 东明县| 南川市| 宁阳县| 英超| 惠安县| 沧州市| 沐川县| 宣武区| 抚松县| 吴桥县| 宜兴市| 嘉祥县| 锡林郭勒盟| 锡林浩特市| 奉化市| 莎车县| 道孚县| 瑞金市| 怀安县| 信丰县| 酒泉市| 宜章县| 敦化市| 太康县| 石首市| 齐齐哈尔市| 鄂伦春自治旗| 读书|