Spring Boot 如何實現定時任務

Spring Boot 如何實現定時任務

在現代的微服務架構中,定時任務是一個常見的需求。無論是數據定時同步、定時清理緩存,還是定時發送通知,Spring Boot 提供了非常強大且靈活的定時任務支持。本文將詳細介紹如何在 Spring Boot 中實現定時任務,包括使用 @Scheduled 注解和集成 Quartz 調度框架的兩種方式。

一、使用 @Scheduled 注解實現定時任務

Spring Boot 提供了內置的 @Scheduled 注解,可以非常方便地實現簡單的定時任務。這種方式適合輕量級的定時任務,且不需要復雜的調度邏輯。

1.1 添加依賴

在 Spring Boot 項目中,@Scheduled 注解是內置支持的,因此不需要額外添加依賴。

1.2 啟用定時任務支持

在主類或配置類上添加 @EnableScheduling 注解,啟用定時任務支持。

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

1.3 定義定時任務

在任意的 @Component@Service 類中,使用 @Scheduled 注解定義定時任務。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class MyScheduledTasks {// 每兩小時運行一次@Scheduled(cron = "0 0 0/2 * * ?")public void runTask() {System.out.println("任務執行了!當前時間:" + new java.util.Date());}
}

1.4 常見的 Cron 表達式

  • 0 0/30 * * * ?:每30分鐘執行一次。
  • 0 0 9-17 * * ?:每天的9點到17點之間,每小時執行一次。
  • 0 0 8,14 * * ?:每天的8點和14點各執行一次。
  • 0 0-5 14 * * ?:在每天14點的第0分鐘至第5分鐘的每分鐘執行一次。
  • 0 0-5 14,18 * * ?:在每天14點和18點的第0分鐘至第5分鐘的每分鐘執行一次。

1.5 注意事項

  • 線程池配置:默認情況下,Spring 的 @Scheduled 使用單線程執行任務。如果任務較多或任務執行時間較長,可能會導致任務延遲。可以通過配置 ThreadPoolTaskExecutor 來指定線程池大小:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;@Configuration
    public class SchedulingConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10); // 設置線程池大小executor.setThreadNamePrefix("scheduled-task-");executor.initialize();taskRegistrar.setTaskExecutor(executor);}
    }
    
  • 任務執行時間@Scheduled 的任務執行時間是基于服務器的系統時間,因此需要確保服務器時間準確。

二、使用 Quartz 調度框架實現定時任務

對于更復雜的調度需求,如任務持久化、任務恢復、任務分組等,Quartz 是一個強大的調度框架。Spring Boot 提供了對 Quartz 的集成支持。

2.1 添加依賴

pom.xml 文件中添加 Quartz 和 Spring Boot 的集成依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2.2 配置 Quartz

application.properties 文件中配置 Quartz 的相關參數:

# 配置Quartz的調度器名稱
spring.quartz.scheduler.name=myScheduler
# 配置線程池大小
spring.quartz.scheduler.thread-count=10
# 配置任務存儲類型為內存
spring.quartz.job-store.type=memory
# 配置任務存儲的數據庫連接(如果使用數據庫存儲任務)
# spring.quartz.job-store.driver-class-name=com.mysql.cj.jdbc.Driver
# spring.quartz.job-store.url=jdbc:mysql://localhost:3306/quartz_db
# spring.quartz.job-store.user=root
# spring.quartz.job-store.password=root

2.3 定義任務類

創建一個實現 Job 接口的任務類:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("任務執行了!當前時間:" + new java.util.Date());}
}

2.4 配置任務和觸發器

在配置類中定義任務和觸發器:

import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class QuartzConfig {@Beanpublic JobDetail myJobDetail() {return JobBuilder.newJob(MyJob.class).withIdentity("myJob", "group1").build();}@Beanpublic Trigger myJobTrigger() {return TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(CronScheduleBuilder.cronSchedule("0 0 0/2 * * ?")).forJob(myJobDetail()).build();}
}

2.5 注意事項

  • 任務持久化:Quartz 支持將任務存儲在數據庫中,即使應用重啟,任務也可以繼續執行。需要配置數據庫連接信息。
  • 任務分組:可以通過 withIdentity 方法為任務和觸發器指定分組,方便管理。
  • 任務恢復:Quartz 支持任務恢復,即使任務在執行過程中應用崩潰,任務也可以在應用重啟后繼續執行。

三、總結

Spring Boot 提供了兩種實現定時任務的方式:@Scheduled 注解和 Quartz 調度框架。@Scheduled 適合簡單的定時任務,而 Quartz 提供了更強大的功能,適合復雜的調度需求。根據實際需求選擇合適的方式即可。

  • 如果任務簡單且不需要復雜的調度邏輯,推薦使用 @Scheduled
  • 如果需要任務持久化、任務恢復或復雜的調度策略,推薦使用 Quartz。

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

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

相關文章

“粽”覽全局:分布式系統架構與實踐深度解析(端午特別版)

第一部分&#xff1a;引言——技術世界的“端午”第二部分&#xff1a;分布式系統概述——粽子節點初探第三部分&#xff1a;核心技術詳解——技術“粽子”大解構 粽葉篇&#xff1a;通信協議糯米篇&#xff1a;一致性算法餡料篇&#xff1a;任務調度與計算包扎篇&#xff1a;系…

AppTrace 視角下 App 一鍵拉起:提升應用轉化率的高效方案?

官網地址&#xff1a;AppTrace - 專業的移動應用推廣追蹤平臺 在大規模開展 App 推廣、用戶召回、廣告投放、邀請傳播等活動時&#xff0c;高效的深度鏈接方案至關重要。它不僅能縮短用戶路徑&#xff0c;帶來無縫、流暢的跳轉體驗&#xff0c;更核心的是通過參數傳遞打通 web…

手拆STL

vector v e c t o r vector vector&#xff0c;動態數組。 先來看一下它的一些基本操作及其拆后殘渣。 1.a.push_back(x)&#xff0c;將 x x x加入動態數組 a a a的末尾。 實現&#xff1a;a[cnt]x 2.a.size()&#xff0c;查詢動態數組 a a a中元素的數量。 實現&#xff1a;cn…

6.01打卡

浙大疏錦行 DAY 40 訓練和測試的規范寫法 知識點回顧&#xff1a; 1. 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中 2. 展平操作&#xff1a;除第一個維度batchsize外全部展平 3. dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模…

CSS專題之層疊上下文

前言 石匠敲擊石頭的第 15 次 在平常開發的時候&#xff0c;有時候會遇到使用 z-index 調整元素層級沒有效果的情況&#xff0c;究其原因還是因為對層疊上下文不太了解&#xff0c;看了網上很多前輩的文章&#xff0c;決定打算寫一篇文章來梳理一下&#xff0c;如果哪里寫的有問…

RabbitMQ集群與負載均衡實戰指南

文章目錄 集群架構概述仲裁隊列的使用1. 使用Spring框架代碼創建2. 使用amqp-client創建3. 使用管理平臺創建 負載均衡引入HAProxy 負載均衡&#xff1a;使用方法1. 修改配置文件2. 聲明隊列 test_cluster3. 發送消息 集群架構 概述 RabbitMQ支持部署多個結點&#xff0c;每個…

Prometheus + Grafana + Cadvisor:構建高效企業級服務監控體系

在現代軟件開發和運維領域&#xff0c;容器化技術的應用越來越廣泛&#xff0c;其中 Docker 作為最受歡迎的容器化解決方案之一&#xff0c;其容器的監控管理變得至關重要。本文將詳細介紹如何使用 cadvisor、Prometheus 和 Grafana 來監控 Docker 容器的狀態。 一、安裝鏡像 …

小提琴圖繪制-Graph prism

在 GraphPad Prism 中為小提琴圖添加顯著性標記(如*P<0.05)的步驟如下: 步驟1:完成統計檢驗 選擇數據表:確保數據已按分組排列(如A列=Group1,B列=Group2)。執行統計檢驗: 點擊工具欄 Analyze → Column analyses → Mann-Whitney test(非參數檢驗,適用于非正態數…

【開源工具】跳過網頁APP禁止粘貼限制:自動輸入鍵盤模擬工具

&#x1f4cc; 【黑科技】跳過網頁APP禁止粘貼限制&#xff1a;自動輸入鍵盤模擬工具 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f525; 系列專欄&#xff1a;&#x1f40d;《Python開源項目實戰》 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱情源自每一…

深度學習篇---face-recognition的優劣點

face_recognition庫是一個基于 Python 的開源人臉識別工具&#xff0c;封裝了 dlib 庫的深度學習模型&#xff0c;具有易用性高、集成度強的特點。以下從技術實現、應用場景等維度分析其優劣勢&#xff1a; 一、核心優勢 1. 極簡 API 設計&#xff0c;開發效率極高 代碼量少…

Git深入解析功能邏輯與核心業務場景流程

一、Git核心功能邏輯架構 #mermaid-svg-9tj1iCr99u6QenJM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9tj1iCr99u6QenJM .error-icon{fill:#552222;}#mermaid-svg-9tj1iCr99u6QenJM .error-text{fill:#552222;st…

【大模型】情緒對話模型項目研發

一、使用框架&#xff1a; Qwen大模型后端Open-webui前端實現使用LLamaFactory的STF微調數據集&#xff0c;vllm后端部署&#xff0c; 二、框架安裝 下載千問大模型 安裝魔塔社區庫文件 pip install modelscope Download.py 內容 from modelscope import snapshot_downlo…

Java基礎 Day26

一、網絡編程簡介 1、概念 網絡編程指在網絡通信協議下&#xff0c;不同計算機上運行的程序&#xff0c;進行數據傳輸 2、軟件架構 &#xff08;1&#xff09;CS架構&#xff08;客戶端和服務端&#xff09; 在用戶本地有一個客戶端程序&#xff0c;在遠程有一個服務器端程…

【Hot 100】45. 跳躍游戲 II

目錄 引言跳躍游戲 IIdp解題貪心解題 &#x1f64b;?♂? 作者&#xff1a;海碼007&#x1f4dc; 專欄&#xff1a;算法專欄&#x1f4a5; 標題&#xff1a;【Hot 100】45. 跳躍游戲 II?? 寄語&#xff1a;書到用時方恨少&#xff0c;事非經過不知難&#xff01; 引言 跳躍…

計算機網絡第1章(上):網絡組成與三種交換方式全解析

目錄 一、計算機網絡的概念二、計算機網絡的組成和功能2.1 計算機網絡的組成2.2 計算機網絡的功能 三、電路交換、報文交換、分組交換3.1 電路交換&#xff08;Circuit Switching&#xff09;3.2 報文交換&#xff08;Message Switching&#xff09;3.3 分組交換&#xff08;Pa…

[總結]前端性能指標分析、性能監控與分析、Lighthouse性能評分分析

前端性能分析大全 前端性能優化 LightHouse性能評分 性能指標監控分析 瀏覽器加載資源的全過程性能指標分析 性能指標 在實現性能監控前&#xff0c;先了解Web Vitals涉及的常見的性能指標 Web Vitals 是由 Google 推出的網頁用戶體驗衡量指標體系&#xff0c;旨在幫助開發者量…

Windows商店中的免費掃雷游戲應用

《掃雷》是一款經典的單人益智小游戲&#xff0c;1992年微軟發布的Windows 3.1中加入該游戲&#xff0c;從此風靡全世界。游戲目標是通過邏輯推理&#xff0c;在最短的時間內根據點擊格子出現的數字找出所有非雷格子&#xff0c;同時避免踩雷。 此Windows應用實現了經典掃雷的…

ActiveMQ 可觀測性最佳實踐

ActiveMQ 介紹 ActiveMQ 是一款高性能、開源的消息中間件&#xff0c;支持多種消息協議&#xff08;如 JMS、AMQP、MQTT 等&#xff09;&#xff0c;能夠實現應用程序之間的異步通信和消息傳遞。它提供點對點&#xff08;Queue&#xff09;和發布/訂閱&#xff08;Topic&#…

【Linux命令】scp遠程拷貝

文章目錄 1. 基本語法與常用選項2. 使用場景和使用示例本地文件->遠程主機遠程主機文件->本地遠程主機->另一臺遠程主機 3. 使用注意事項 scp&#xff08;Secure Copy Protocol&#xff09;是linux中基于ssh的安全文件傳輸工具&#xff0c;用于在本地和遠程主機之前安…

如何優化 Harmony-Cordova 應用的性能?

以下是針對 ?Harmony-Cordova 應用性能優化?的完整方案&#xff0c;結合鴻蒙原生特性和Cordova框架優化策略&#xff1a; ??一、渲染性能優化? ?減少布局嵌套層級? 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多層 Column/Row 嵌套&#xff0c;避免冗…