Spring @Scheduled注解詳解

文章目錄

  • 1.@Scheduled注解定義
  • 2.配置 @Scheduled
    • 2.1 開啟定時任務支持
    • 2.2 創建定時任務
  • 3. 常用屬性
    • 3.1 fixedRate
    • 3.2 fixedDelay
    • 3.3 cron
  • 4.工作原理
    • 4.1 基于TaskScheduler
    • 4.2 使用 ThreadPoolTaskScheduler
    • 4.3 定時任務的執行流程
  • 5. 延時執行的定時任務
    • 5.1 創建定時任務類
    • 5.2 解釋
  • 6.自定義TaskScheduler

1.@Scheduled注解定義

簡單來說, @Scheduled是 Spring 提供的一個注解,用于在方法上標記定時任務。通過它,我們可以輕松地在指定的時間間隔或特定的時間點執行某些代碼,而不需要引入額外的定時任務庫。

舉個例子:
假設你有一個方法需要每隔5分鐘執行一次,你只需要在方法上加上 @Scheduled注解,并設置相應的屬性即可。

2.配置 @Scheduled

在開始使用 @Scheduled 之前,我們需要做一些配置工作。首先,確保你的 Spring 項目中引入了 spring-boot-starter,因為它已經包含了必要的依賴。

2.1 開啟定時任務支持

在你的主類(通常標注了 @SpringBootApplication 的類)上添加@EnableScheduling注解,以啟用定時任務的支持。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class ScheduledDemoApplication {public static void main(String[] args) {SpringApplication.run(ScheduledDemoApplication.class, args);}
}

2.2 創建定時任務

接下來,我們創建一個服務類,并在其中定義一個定時任務方法。例如,每隔5秒打印一條消息:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class ScheduledTasks {@Scheduled(fixedRate = 5000)public void reportCurrentTime() {System.out.println("每5秒執行一次任務,當前時間:" + System.currentTimeMillis());}
}

3. 常用屬性

@Scheduled 注解提供了多種方式來配置定時任務的執行時間,主要包括以下幾種

3.1 fixedRate

指定一個固定的時間間隔,以毫秒為單位,表示上一次任務開始執行后,多久再次執行。

@Scheduled(fixedRate = 5000) // 每5秒執行一次
public void fixedRateTask() {System.out.println("Fixed Rate Task - " + System.currentTimeMillis());
}

3.2 fixedDelay

指定一個固定的時間間隔,表示上一次任務執行完成后,等待多久再次執行。

@Scheduled(fixedDelay = 5000) // 上一次任務完成后5秒執行一次
public void fixedDelayTask() {System.out.println("Fixed Delay Task - " + System.currentTimeMillis());
}

3.3 cron

使用 cron 表達式確地指定任務的執行時間。cron 表達式可以讓你定義復雜的時間計劃。

@Scheduled(cron = "0 0/1 * * * ?") // 每分鐘執行一次
public void cronTask() {System.out.println("Cron Task - " + System.currentTimeMillis());
}

4.工作原理

了解了如何使用 @Scheduled,那么它背后到底是如何運作的呢?讓我們來深入探討一下。

4.1 基于TaskScheduler

Spring 的定時任務是基于 TaskScheduler 接口實現的。當我們在方法上使用 @Scheduled 注解時,Spring 會自動為其創建一個調度器,并按照我們定義的時間計劃來執行任務

4.2 使用 ThreadPoolTaskScheduler

默認情況下,Spring 使用 ThreadPoolTaskScheduler 作為TaskScheduler的實現類。它內部維護了一個線程池,用于執行定時任務。這樣可以確保多個定時任務能夠并發執行,而不會阻塞主線程。

注意: 如果你的應用中有多個定時任務,或者某些任務執行時間較長,建議自定義ThreadPoolTaskScheduler的線程池大小,以避免任務堆積或資源浪費。

4.3 定時任務的執行流程

1、初始化階段:啟動 Spring 應用時,@EnableScheduling 注解會觸發 Spring 的配置,掃描所有被 @Scheduled 注解標記的方法。
2、注冊任務:所有符合條件的定時任務方法會被注冊到 TaskScheduler 中。
3、執行任務:根據配置的時間計劃,TaskScheduler 會調度并在合適的線程中執行相應的任務方法。

5. 延時執行的定時任務

為了更好地理解 @Scheduled 的使用,我們來實現一個稍微復雜些的示例——延時執行任務。假設我們有一個任務需要在應用啟動后延時10秒執行一次,然后每隔5秒重復執行。

5.1 創建定時任務類

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
publicclass DelayedScheduledTasks {privateboolean firstRun = true;@Scheduled(fixedRate = 5000, initialDelay = 10000)public void delayedTask() {if (firstRun) {System.out.println("延時10秒后首次執行任務,當前時間:" + System.currentTimeMillis());firstRun = false;} else {System.out.println("每5秒執行一次任務,當前時間:" + System.currentTimeMillis());}}
}

5.2 解釋

fixedRate = 5000: 任務每5秒執行一次。
initialDelay = 10000: 應用啟動后,延時10秒首次執行任務。

6.自定義TaskScheduler

有時候,默認的 ThreadPoolTaskScheduler 可能無法滿足我們的需求,比如需要更高的并發能力或特定的線程名稱模式。這時候,我們可以自定義一個 TaskScheduler Bean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@Configuration
publicclass SchedulerConfig {@Beanpublic ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(10); // 設置線程池大小scheduler.setThreadNamePrefix("MyScheduler-"); // 設置線程名稱前綴scheduler.initialize();return scheduler;}
}

通過上述配置,我們創建了一個擁有10個線程的線程池,并為每個線程命名,方便日志追蹤和調試。

編輯:玄魄靈歸

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82971.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82971.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

理解計算機系統_并發編程(5)_基于線程的并發(二):線程api和基于線程的并發服務器

前言 以<深入理解計算機系統>(以下稱“本書”)內容為基礎&#xff0c;對程序的整個過程進行梳理。本書內容對整個計算機系統做了系統性導引,每部分內容都是單獨的一門課.學習深度根據自己需要來定 引入 接續上一篇理解計算機系統_并發編程(4)_基于線程的并發(一…

使用PhpStudy搭建Web測試服務器

一、安裝PhpStudy 從以下目錄下載PhpStudy安裝文件 Windows版phpstudy下載 - 小皮面板(phpstudy) (xp.cn) 安裝成功之后打開如下界面 點擊啟動Apache 查看網站地址 在瀏覽器中輸入localhost:88,出現如下頁面就ok了 二、與Unity交互 1.配置下載文件路徑&#xff0c;點擊…

cocos creator 3.8 下的 2D 改動

在B站找到的系統性cocos視頻教程,純2D開發入門,鏈接如下: zzehz黑馬程序員6天實戰游戲開發微信小程序&#xff08;Cocos2d的升級版 CocosCreator JavaScript&#xff09;_嗶哩嗶哩_bilibili黑馬程序員6天實戰游戲開發微信小程序&#xff08;Cocos2d的升級版 CocosCreator Ja…

【Hot 100】208. 實現 Trie (前綴樹)

目錄 引言實現 Trie (前綴樹)我的解題代碼解析代碼思路分析優化建議1. 內存泄漏問題2. 使用智能指針優化內存管理3. 輸入合法性校驗&#xff08;可選&#xff09;4. 其他優化 總結 &#x1f64b;?♂? 作者&#xff1a;海碼007&#x1f4dc; 專欄&#xff1a;算法專欄&#x1…

Unity3D仿星露谷物語開發42之粒子系統

1、目標 使用例子系統&#xff0c;實現割草后草掉落的特效。 通過PoolManager獲取特效預制體&#xff0c;通過VFXManager來觸發特效。 2、配置例子特效 在Hierarchy -> PersistentScene下創建新物體命名為Reaping。 給該物體添加Particle System組件。 配置例子系統參數…

視覺-語言基礎模型作為高效的機器人模仿學習范式

摘要 近期&#xff0c;視覺語言基礎模型領域取得的進展彰顯了其在理解多模態數據以及解決復雜視覺語言任務&#xff08;包括機器人操作任務&#xff09;方面的能力。我們致力于探尋一種簡便的方法&#xff0c;利用現有的視覺語言模型&#xff08;VLMs&#xff09;&#xff0c;僅…

zst-2001 上午題-歷年真題 算法(5個內容)

回溯 算法 - 第1題 找合適的位置&#xff0c;如果沒有位置就按B回家 d 分治 算法 - 第2題 b 算法 - 第3題 a 算法 - 第4題 劃分一般就是分治 a 算法 - 第5題 分治 a 0-1背包 算法 - 第6題 c 算法 - 第7題 最小的為c 3100 c 算法 - 第8題 …

淺論3DGS濺射模型在VR眼鏡上的應用

擺爛仙君小課堂開課了&#xff0c;本期將介紹如何手搓VR眼鏡&#xff0c;并將隨手拍的電影變成3D視頻。 一、3DGS模型介紹 3D 高斯模型是基于高斯函數構建的用于描述三維空間中數據分布概率的模型&#xff0c;高斯函數在數學和物理領域有著廣泛應用&#xff0c;其在 3D 情境下…

2025年中期大語言模型實力深度剖析

I. 引言&#xff1a;解讀2025年動態LLM競技場中的“實力” 用戶提出的“如今哪個大語言模型最強”這一問題&#xff0c;精準地反映了業界對飛速發展的人工智能&#xff08;AI&#xff09;領域的高度關注。本報告基于截至2025年5月的最新數據&#xff0c;旨在對這一問題進行全面…

Spark緩存-cache

一、RDD持久化 1.什么時候該使用持久化&#xff08;緩存&#xff09; 2. RDD cache & persist 緩存 3. RDD CheckPoint 檢查點 4. cache & persist & checkpoint 的特點和區別 特點 區別 二、cache & persist 的持久化級別及策略選擇 Spark的幾種持久化…

嵌入式開發學習日志(數據結構--順序結構單鏈表)Day19

一、順序結構 安裝軟件命令&#xff1a; sudo apt-get install (軟件名) 安裝格式化對齊&#xff1a;sudo apt-get install clang-format 內存泄漏檢測工具&#xff1a; sudo apt-get install valgrind 編譯后&#xff0c;使用命令 valgrind ./a.out 即可看內…

第六節第二部分:抽象類的應用-模板方法設計模式

模板方法設計模式的寫法 建議使用final關鍵字修飾模板方法 總結 代碼&#xff1a; People(父類抽象類) package com.Abstract3; public abstract class People {/*設計模板方法設計模式* 1.定義一個模板方法出來*/public final void write(){System.out.println("\t\t\t…

2025年滲透測試面試題總結-滲透測試紅隊面試三(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 滲透測試紅隊面試三 六十一、主機被入侵自查解決方案 六十二、NAT&#xff08;網絡地址轉換&#xff…

springboot-web基礎

21.web spring MVC 基于瀏覽器的 B/S 結構應用十分流行。Spring Boot 非常適合 Web 應用開發。可以使用嵌入式 Tomcat、Jetty、 Undertow 或 Netty 創建一個自包含的 HTTP 服務器。一個 Spring Boot 的 Web 應用能夠自己獨立運行&#xff0c;不依賴需 要安裝的 Tomcat&#x…

重構Cursor無限電子郵箱注冊系統的技術實踐

引言 在當今數字化時代&#xff0c;電子郵箱已成為個人和企業網絡身份的基礎。作為開發者&#xff0c;我們往往會遇到需要設計注冊系統的場景&#xff0c;而如何構建一個既安全又用戶友好的郵箱注冊系統&#xff0c;是值得深入探討的話題。本文將圍繞Cursor郵箱系統的技術重構…

2025.05.10京東機考真題算法崗-第三題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 03. 忍者屋頂之旅 問題描述 LYA是一位身手敏捷的忍者,正在一個古老的村莊進行飛檐走壁的訓練。村莊有兩排房屋,每排從左到右排列著 n n

vscode不能跳轉到同一個工作區的其他文件夾

明白了&#xff0c;你說的“第二種情況”是指&#xff1a; 你先打開的是項目文件夾&#xff08;比如 MyProject&#xff09;&#xff0c;然后通過 VS Code 的“添加文件夾到工作區”功能&#xff0c;把 ThirdPartyLib 文件夾添加進來。 結果&#xff0c;項目代碼里 #include “…

FastAPI 和 MongoDB 實現請求頭參數處理的示例,并在 React 中進行渲染

FastAPI 和 MongoDB 后端 安裝必要的庫 安裝 FastAPI、Uvicorn、Motor&#xff08;用于 MongoDB 的異步驅動&#xff09;和 Pydantic&#xff08;用于數據驗證&#xff09;。 pip install fastapi uvicorn motor pydantic創建 FastAPI 應用 創建一個文件 main.py&#xff0c;并…

技術倫理雙軌認證如何重構AI工程師能力評估體系——基于AAIA框架的技術解析與行業實證研究

引言&#xff1a;AI工程師能力評估的范式轉型 2025年全球人工智能產業呈現出兩大特征&#xff1a;技術迭代加速與監管框架完善。據Gartner數據顯示&#xff0c;全球75%的企業在AI項目部署中遭遇技術倫理混合型難題&#xff0c;傳統單維度技術認證體系已無法滿足產業需求。本文…

03.Golang 切片(slice)源碼分析(二、append實現)

Golang 切片&#xff08;slice&#xff09;源碼分析&#xff08;二、append實現&#xff09; 前言&#xff1a; Golang 切片&#xff08;slice&#xff09;源碼分析&#xff08;一、定義與基礎操作實現&#xff09; 在前面的文章我們介紹了&#xff0c;切片的結構體與創建\擴容…