SpringBoot實現定時任務的動態停止和更新

目錄

  • 定時任務管理器
  • 定時任務的任務接口
  • 定時任務和定時任務結果的緩存對象
  • 定時任務
  • 使用姿勢

定時任務管理器

  • 負責啟動一個定時任務、停止一個定時任務、更新一個定時任務
/*** 定時任務管理器* 1、創建并啟動一個定時任務* 2、停止一個定時任務* 3、更新一個定時任務*/
public class ScheduleManager {private final Logger logger = LoggerFactory.getLogger(ScheduleManager.class);@Autowiredprivate ThreadPoolTaskScheduler taskScheduler;/*** 內部正在執行的定時任務緩存*/private final Map<String, ScheduleTaskHolder> cache = new ConcurrentHashMap<>();public ScheduleManager(ThreadPoolTaskScheduler taskScheduler) {this.taskScheduler = taskScheduler;}/*** 啟動一個定時任務** @param scheduleTask 定時任務實現類* @param cron         定時任務的cron表達式* @return key*/public String startTask(ScheduleTask scheduleTask, String cron) {ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(scheduleTask, new CronTrigger(cron));String key = UUID.randomUUID().toString();ScheduleTaskHolder holder = new ScheduleTaskHolder(scheduleTask, scheduledFuture);cache.put(key, holder);logger.info("{} 定時任務啟動成功!唯一標識為:{}", scheduleTask.getName(), key);return key;}/*** 停止一個定時任務** @param key 定時任務的唯一標識*/public void stopTask(String key) {if (StringUtils.isBlank(key)) {return;}ScheduleTaskHolder holder = cache.get(key);if (Objects.isNull(holder)) {return;}ScheduledFuture scheduledFuture = holder.getScheduledFuture();boolean cancel = scheduledFuture.cancel(true);if (cancel) {logger.info("{} 定時任務停止成功!唯一標識為:{}", holder.getScheduleTask().getName(), key);} else {logger.error("{} 定時任務停止失敗!唯一標識為:{}", holder.getScheduleTask().getName(), key);}}/*** 更新一個定時任務的執行時間** @param key  定時任務的唯一標識* @param cron 新的cron表達式* @return key*/public String changeTask(String key, String cron) {if (StringUtils.isAnyBlank(key, cron)) {throw new RuntimeException("定時任務的唯一標識以及新的執行表達式不能為空");}ScheduleTaskHolder holder = cache.get(key);if (Objects.isNull(holder)) {throw new RuntimeException(key + "唯一標識不存在");}stopTask(key);return startTask(holder.getScheduleTask(), cron);}}

定時任務的任務接口

  • 定時任務的運行邏輯在重寫的 run 方法中實現
/*** 定時任務的任務接口*/
public interface ScheduleTask extends Runnable {/*** 獲取定時任務的名稱** @return*/String getName();}

定時任務和定時任務結果的緩存對象

  • 負責緩存定時任務和控制該定時任務
/*** 定時任務和定時任務結果的緩存對象*/
public class ScheduleTaskHolder implements Serializable {/*** 執行任務實體*/private ScheduleTask scheduleTask;/*** 執行任務的結果實體*/private ScheduledFuture scheduledFuture;public ScheduleTaskHolder() {}public ScheduleTaskHolder(ScheduleTask scheduleTask, ScheduledFuture scheduledFuture) {this.scheduleTask = scheduleTask;this.scheduledFuture = scheduledFuture;}public ScheduleTask getScheduleTask() {return scheduleTask;}public void setScheduleTask(ScheduleTask scheduleTask) {this.scheduleTask = scheduleTask;}public ScheduledFuture getScheduledFuture() {return scheduledFuture;}public void setScheduledFuture(ScheduledFuture scheduledFuture) {this.scheduledFuture = scheduledFuture;}
}

定時任務

  • 具體實現的定時任務
/*** 定時任務*/
public class ThreadPoolWarnTask implements ScheduleTask {@Overridepublic String getName() {return "threadPoolWarnTask";}@Overridepublic void run() {}
}

使用姿勢

  • 引入 ScheduleManager 對象
  • 開啟定時任務、關閉定時任務、更新定時任務
// 傳入一個定時任務和CRON表達式開啟定時任務,返回該定時任務的唯一標識
String taskKey = scheduleManager.startTask(threadPoolWarnTask, CRON);
// 停止定時任務
scheduleManager.stopTask(taskKey);
// 更新定時任務的CRON
scheduleManager.changeTask(taskKey, newCRON);

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

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

相關文章

Mybatis-plus學習|性能分析插件、條件構造器、代碼自動生成器

性能分析插件 我們在平時的開發中&#xff0c;會遇到一些慢sql。測試!druid…. MP也提供性能分析插件&#xff0c;如果超過這個時間就停止運行! 1、導入插件 該插件只允許在開發和測試環境中使用&#xff0c;故先設置開發環境為開發模式 在MP配置類中注冊這個插件&#xff0…

【Python機器學習】數據表示和特征工程的一些概念

對于由浮點數組成的二維數據&#xff0c;其中每一列是描述數據點的連續特征。 對于很多應用來說&#xff0c;數據的收集方式并不是這樣&#xff0c;一種特別常見的特征類型就是分類特征&#xff0c;也叫離散特征&#xff0c;這種特征通常不是說數值。 分類特征和連續特征之間…

Python:淺談迭代器、生成器與協程的演化路徑

“人生苦短&#xff0c;我用Python”&#xff0c;雖然說大量數學和統計分析庫是一個重要優勢&#xff0c;但是歸根結底&#xff0c;Python的最大優勢就是三點&#xff1a; 但是通常一般來講&#xff0c;當扯到并發的時候&#xff0c;無論是多服務器、多進程、多線程、還是協程&…

C# SocketUDP服務器,組播

SocketUDP 自己即是服務器又是客戶端 &#xff0c;在發消息只需要改成對方ip和端口號即可 前提對方必須開啟服務器 socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.72"), 8080)); 控件&#xff1a;Button,TextBox,RichTextBox 打開自己服務器 public…

【操作系統】信號處理與阻塞函數|時序競態問題

&#x1f525;博客主頁&#xff1a; 我要成為C領域大神&#x1f3a5;系列專欄&#xff1a;【C核心編程】 【計算機網絡】 【Linux編程】 【操作系統】 ??感謝大家點贊&#x1f44d;收藏?評論?? 本博客致力于知識分享&#xff0c;與更多的人進行學習交流 ? 關于阻塞函數和…

Windows環境部署MySQL_8.4.0 LTS的部署安裝、驗證連接以及卸載全過程實操手冊

前言&#xff1a; 什么是 MySQL MySQL 是一個關系型數據庫管理系統&#xff0c;由瑞典 MySQL AB 公司開發&#xff0c;目前屬于Oracle 公司。MySQL 是一種關系型數據庫管理系統&#xff0c;關系型數據庫將數據保存在不同的表中&#xff0c;而不是將所有數據放在一個大倉庫內&am…

secureCRT中使用python腳本自動化測試vela設備

利用vela設備自帶的wapi命令行&#xff0c;重復執行聯網斷網的命令&#xff0c;測試系統穩定性。 實現如下&#xff0c; # $language "python" # $interface "1.0"# This automatically generated script may need to be # edited in order to work co…

8.12 矢量圖層面要素單一符號使用七(隨機標記填充)

文章目錄 前言隨機標記填充&#xff08;Random Marker Fill&#xff09;QGis設置面符號為隨機標記填充&#xff08;Random Marker Fill&#xff09;二次開發代碼實現隨機標記填充&#xff08;Random Marker Fill&#xff09; 總結 前言 本章介紹矢量圖層線要素單一符號中使用隨…

分班查詢怎么發布?

在現代教育環境中&#xff0c;傳統的學生分班通知方式可能顯得有些過時和低效。通常&#xff0c;這些方式依賴于紙質通知單&#xff0c;這不僅需要大量的物理資源進行打印和分發&#xff0c;而且容易出錯&#xff0c;如丟失、錯誤分發或延遲。 幸運的是&#xff0c;現在有了更高…

掌握Perl并發:線程與進程編程全攻略

掌握Perl并發&#xff1a;線程與進程編程全攻略 引言 Perl作為一種功能強大的編程語言&#xff0c;提供了豐富的并發編程手段。無論是通過threads模塊實現的線程&#xff0c;還是通過fork系統調用產生的進程&#xff0c;Perl都能幫助開發者高效地處理多任務。本文將深入探討如…

解釋Java的垃圾回收機制以及垃圾回收器的工作原理。

Java的垃圾回收機制&#xff08;Garbage Collection&#xff0c;GC&#xff09;是Java虛擬機&#xff08;JVM&#xff09;的一個重要組成部分&#xff0c;它負責自動管理內存&#xff0c;確保內存泄漏和內存溢出錯誤不會發生。垃圾回收器&#xff08;Garbage Collector&#xf…

心靈館咨詢系統小程序心理咨詢平臺聊天咨詢

心靈館咨詢系統小程序&#xff1a;解鎖你的心靈密碼 &#x1f496; 心靈之旅的導航者 在繁忙的現代生活中&#xff0c;我們時常會面臨各種壓力與困惑。心靈館咨詢系統小程序&#xff0c;如同一位貼心的導航者&#xff0c;引領我們探索內心的世界&#xff0c;尋找真正的自我。 …

shell 腳本的部分指令和操作符

終端輸入兩個數&#xff0c;判斷兩數是否相等&#xff0c;如果不相等&#xff0c;判斷大小關系 2.已知網址www.hqyj.com&#xff0c;使用expr截取出www、hqyj、com&#xff0c;不能使用cut&#xff0c;不能出現數字

JavaWeb系列十九: jQuery的DOM操作 上

查找節點, 修改屬性 查找屬性節點: 查找到所需要的元素之后, 可以調用jQuery對象的attr()方法用來 設置/返回 它的各種屬性值 設置屬性值 $(“img”).attr(“width”, “300”);返回屬性值 $(“img”).attr(“width”); 創建節點 創建節點: 使用jQuery的工廠函數$(): $(html標…

硬核實力再亮,玩出夢想科技發布全球首款安卓系統空間計算機

6月25日&#xff0c;玩出夢想科技在新加坡召開全球新品發布會&#xff0c;正式發布全球首款安卓系統空間計算機——玩出夢想MR&#xff0c;填補了空間計算機在安卓生態的空白。 作為品牌沉淀兩年的破曉之作&#xff0c;玩出夢想MR以業內領先軟硬件配置&#xff0c;強大自研算法…

刪除win10未激活水印

通過終止進程來刪除水印 remove.batecho off taskkill /F /IM explorer.exe explorer.exe exit右鍵管理員執行重啟

解決了!暗影精靈8 Pro酷睿版無聲音,揚聲器和麥克風都沒有聲音!

困擾好幾天的問題解決了&#xff01; 暗影精靈8 Pro酷睿版無聲音&#xff0c;揚聲器和麥克風都沒有聲音&#xff01;&#xff01;方法適用于OMEN by HP Gaming Laptop 16-k0xxx&#xff08;暗影精靈8 Pro酷睿版&#xff09;的Windows 10聲卡驅動&#xff01; 朋友們&#xff…

【應用開發一】LED開發

文章目錄 1應用層控制外設的兩種方式2 sysfs和/sys關系3 LED控制方式3.1 基本情況3.2 LED屬性文件介紹3.3 命令行屬性測試3.4 led程序3.5 開發板上測試 1應用層控制外設的兩種方式 使用設備文件控制 在Linux系統下&#xff0c;一切皆是文件。應用層控制底層硬件同樣也是通過文…

如何在 Linux 上安裝 Docker Desktop

如何在 Linux 上安裝 Docker Desktop Docker 是一個用于開發、部署和運行應用程序的開放平臺。Docker Desktop 是 Docker 在 macOS 和 Windows 上的官方客戶端&#xff0c;現在也支持 Linux 系統。本文將詳細介紹如何在 Linux 上安裝 Docker Desktop。 系統要求 在開始安裝之…