Spring Boot3 實現定時任務 每10分鐘執行一次,同時要解決分布式的問題 區分不同場景

在Spring Boot 3中實現分布式定時任務,確保多實例環境下任務僅執行一次,可以采用以下方案:


方案一:Redis分布式鎖(推薦)

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.concurrent.TimeUnit;@Component
public class DistributedScheduler {private final StringRedisTemplate redisTemplate;private static final String LOCK_KEY = "TASK_LOCK:MY_TASK";private static final int LOCK_TIMEOUT = 9; // 鎖超時時間(分鐘)public DistributedScheduler(StringRedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;}@Scheduled(cron = "0 */10 * * * *")public void scheduledTask() {Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(LOCK_KEY, "locked", Duration.ofMinutes(LOCK_TIMEOUT));if (lockAcquired != null && lockAcquired) {try {// 執行任務邏輯performTask();} finally {// 任務完成后手動釋放鎖(可選)// redisTemplate.delete(LOCK_KEY);}}}private void performTask() {// 具體任務代碼System.out.println("Task executed at: " + new Date());}
}

依賴配置:

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

關鍵點:

  1. 使用 setIfAbsent 原子性操作獲取鎖,避免并發問題。
  2. 設置鎖的自動過期時間(略小于任務間隔),防止死鎖。
  3. 根據業務需求選擇是否手動釋放鎖(如任務執行時間可能超過鎖超時時間)。

方案二:數據庫樂觀鎖

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;@Component
public class DatabaseLockScheduler {@Scheduled(cron = "0 */10 * * * *")@Transactionalpublic void scheduledTask() {// 1. 查詢最近一次任務記錄TaskLock lastLock = taskLockRepository.findTopByTaskNameOrderByExecuteTimeDesc("MY_TASK");// 2. 檢查是否已執行過if (lastLock != null && lastLock.getExecuteTime().isAfter(LocalDateTime.now().minusMinutes(10))) {return;}// 3. 插入新記錄(利用唯一約束或版本號控制并發)TaskLock newLock = new TaskLock("MY_TASK", LocalDateTime.now());taskLockRepository.save(newLock);// 執行任務邏輯performTask();}
}

實體類示例:

@Entity
public class TaskLock {@Idprivate String taskName;private LocalDateTime executeTime;@Versionprivate Integer version;// 省略構造方法/getter/setter
}

關鍵點:

  1. 使用數據庫唯一約束(復合唯一索引)或版本號控制并發。
  2. 需要處理可能的異常(如唯一約束沖突)。

方案三:Quartz集群模式

配置步驟:

  1. 添加依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
  1. 配置數據庫存儲(application.properties):
spring.quartz.job-store-type=jdbc
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000
  1. 定義任務:
public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) {// 任務邏輯}
}
  1. 配置調度器:
@Configuration
public class QuartzConfig {@Beanpublic JobDetail jobDetail() {return JobBuilder.newJob(MyJob.class).withIdentity("myTask").storeDurably().build();}@Beanpublic Trigger trigger() {return TriggerBuilder.newTrigger().forJob(jobDetail()).withSchedule(CronScheduleBuilder.cronSchedule("0 */10 * * * ?")).build();}
}

方案對比

方案優點缺點
Redis鎖實現簡單,性能高依賴Redis,需處理鎖續期問題
數據庫鎖無需額外中間件數據庫壓力大,需處理并發沖突
Quartz集群官方集群支持,功能強大配置復雜,依賴數據庫表結構

選擇建議:

  • 輕量級場景優先使用Redis鎖
  • 已有數據庫基礎設施可考慮數據庫鎖
  • 復雜調度需求選擇Quartz集群

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

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

相關文章

WPF MVVM入門系列教程(五、命令和用戶輸入)

&#x1f9ed; WPF MVVM入門系列教程 一、MVVM模式介紹二、依賴屬性三、數據綁定四、ViewModel五、命令和用戶輸入六、ViewModel案例演示 WPF中的命令模型 在WPF中&#xff0c;我們可以使用事件來響應鼠標和鍵盤動作。 但使用事件會具備一定的局限性&#xff0c;例如&#x…

2025年01月09日德美醫療前端面試

目錄 vue2 的雙向綁定的原理vue3 的雙向綁定原理vue 的生命周期vue 子組件為何不能修改父組件的值js delete 刪除數組的某一個值會怎么樣vue 和 react 的 diff 算法什么是閉包原型鏈this指向 vue2 的雙向綁定的原理 以下是 Vue 2 雙向綁定的原理&#xff1a; 1. 核心概念 …

知識圖譜 + 大語言模型:打造更聰明、更可靠的AI大腦 —— 探索 GraphRAG 中文優化與可視化實踐

大語言模型&#xff08;LLMs&#xff09;無疑是近年來人工智能領域最耀眼的明星。它們強大的自然語言理解和生成能力&#xff0c;在文本創作、代碼生成、對話交互等眾多領域展現了驚人的潛力。然而&#xff0c;當前的 LLMs 并非完美無缺&#xff0c;它們常常面臨著“幻覺”&…

【uniapp】在UniApp中檢測手機是否安裝了某個應用

1. 使用plus.runtime.isApplicationExist&#xff08;僅限App端&#xff09; // 判斷應用是否安裝 function checkAppInstalled(packageName) {if (uni.getSystemInfoSync().platform android || uni.getSystemInfoSync().platform ios) {// 僅App端可用if (typeof plus ! u…

使用 Vue + Axios 構建與后端交互的高效接口調用方案

使用 Vue Axios 構建與后端交互的高效接口調用方案 在 Vue 前端開發中&#xff0c;與后端接口的數據交互是非常核心的部分。而 Axios 是 Vue 項目中最常用的 HTTP 客戶端&#xff0c;具備基于 Promise、攔截器、自定義實例等諸多優勢。 本篇將深入介紹如何基于 Vue 搭配 Axi…

RN學習筆記 ?

太無聊了最近&#xff0c;找點事做&#xff0c;學一下RN豐富一下技術棧&#x1fae1;。但是開發APP除了RN&#xff0c;還有一種選擇就是WebView&#xff0c;但是基于WebView的APP的性能被普遍認為不如RN&#xff0c;因為WebView本質上是一個容器&#xff0c;用于在應用中嵌入網…

聊天助手提示詞調優案例

一、背景 今天有粉絲說自己的聊天助手提示詞輸出的效果不好&#xff0c;輸出的內容不是太呆板就是太浮夸&#xff0c;希望更像真人一樣。 本文介紹幾個調優方法&#xff0c;希望對大家有啟發。 二、調優 《系統掌握大語言模型提示詞 - 從理論到實踐》提示詞小冊中介紹了很多…

5.6 react組件化開發基礎

react 組件開發基礎 組件分類與組件使用 組件傳參 父傳子 【函數數據傳值 實參 形參對應關系】 子傳父 插槽 透傳 useContext 上下文&#xff08;作用域&#xff09; 跨層級調用方法 通過子組件的實例對象useRef 直接調用子組件的方法 和數據 狀態管理&#xff08;非常多…

【SF順豐】順豐開放平臺API對接(Java對接篇)

對接前置篇&#xff1a; 【SF順豐】順豐開放平臺API對接&#xff08;注冊、API測試篇&#xff09;_順豐api接口對接指南-CSDN博客 1.實現效果展示 2.SF順豐開放平臺&#xff0c;JDK資源下載。 下載地址&#xff1a;順豐開放平臺 3.將下載的JDK放入項目中。 4.將JDK資源引入p…

我用cursor 搭建了臨時郵箱服務-Temp Mail 365

用業余時間搭建了一個臨時郵箱&#xff0c;對于后端程序員出身的我&#xff0c;對前端了解的不太多&#xff0c;有了cursor的幫助&#xff0c;補齊了自己的短板&#xff0c;搭建了這個服務&#xff0c;下面對臨時郵箱架構設計與安全性做一個分析。 https://temp-mail-365.com 臨…

破解工業3D可視化困局,HOOPS Visualize助力高效跨平臺協作與交互!

一、當前3D可視化面臨的痛點 &#xff08;1&#xff09;性能瓶頸 現有的許多3D可視化工具在處理大型復雜模型時往往力不從心。例如在航空航天、汽車制造等高端制造業&#xff0c;動輒涉及數以億計的三角面片和海量的紋理細節。這些超大規模的模型在渲染時常常出現卡頓、延遲&…

1、Kafka與消息隊列核心原理詳解

消息隊列&#xff08;Message Queue, MQ&#xff09;作為現代分布式系統的基礎組件&#xff0c;極大提升了系統的解耦、異步處理和削峰能力。本文以Kafka為例&#xff0c;系統梳理消息隊列的核心原理、架構細節及實際應用。 Kafka 基礎架構及術語關系圖 術語簡要說明 Produce…

2025年北京市職工職業技能大賽第六屆信息通信行業網絡安全技能大賽初賽-wp

- -考試當場沒做出來 后面做的 misc ? cd misc ? ls num.docx num.zip ? unzip num.docx Archive: num.docxinflating: [Content_Types].xmlinflating: _rels/.relsinflating: word/document.xmlinflating: word/_rels/document.xml.relsextracting: word/media/image1.jp…

JavaScript 到命令和控制 (C2) 服務器惡意軟件分析及防御

攻擊始于一個經過混淆的JavaScript文件,該文件從開源服務中獲取編碼字符串以執行PowerShell腳本。然后,該腳本從一個IP地址和一個URL縮短器下載一個JPG圖像和一個文本文件,這兩個文件都包含使用隱寫術嵌入的惡意MZ DOS可執行文件。這些有效載荷一旦執行,就會部署Stealer惡意…

【計網】ipconfig、ping、arp、tracert

目錄 ipconfig ping arp tracert cmd ipconfig ipcofig -all IPv4 物理地址 ping 檢測網絡連通情況&#xff0c;分析網絡速度 根據域名得到服務器IP 根據TTL判斷對方所使用的操作系統以及數據包經過路由器數量 byte數據包大小 time響應時間 TTLDNS記錄在DNS服務器上存在…

WiFi那些事兒(八)——802.11n

目錄 802.11n 技術簡介與測試項 一、802.11n 技術簡介 &#xff08;一&#xff09;標準概述 &#xff08;二&#xff09;關鍵技術特性 1. MIMO&#xff08;多輸入多輸出&#xff09;技術 2. 信道綁定&#xff08;Channel Bonding&#xff09; 3. 幀聚合&#xff08;Fram…

碼蹄集——直角坐標到極坐標的轉換、射線、線段

目錄 MT1052 直角坐標到極坐標的轉換 MT1066 射線 MT1067 線段 MT1052 直角坐標到極坐標的轉換 思路&#xff1a; arctan()在c中是atan()&#xff0c;結果是弧度要轉換為度&#xff0c;即乘與180/PI 拓展&#xff1a;cos()、sin()在c代碼中表示方式不變 #include<bits/…

深入解析 Linux/Unix 通信機制:從原理到觀測實踐

深入解析 Linux/Unix 通信機制&#xff1a;從原理到觀測實踐 配圖建議&#xff1a;Linux系統架構與通信機制全景示意圖 一、開篇&#xff1a;理解“一切皆文件”的哲學 Unix/Linux 操作系統的核心靈魂在于其獨特的設計哲學。當 Dennis Ritchie 和 Ken Thompson 在貝爾實驗室開…

spring上傳文件添加水印

1、實現 MultipartFile package com.pojo.common.core.domain;import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream;import org.springframework.lang.Nullable; import org.springframework.util.Assert; im…

嵌入式MCU語音識別算法及實現方案

在嵌入式MCU&#xff08;微控制器單元&#xff09;中實現語音識別&#xff0c;由于資源限制&#xff08;如處理能力、內存、功耗等&#xff09;&#xff0c;通常需要輕量級算法和優化技術。以下是常見的語音識別算法及實現方案&#xff1a; 一、傳統語音識別算法 動態時間規整&…