輕量級 Spring Task 任務調度可視化管理

Spring Task/Spring Scheduler 傻傻分不清

首先做一下“名詞解釋”,分清楚這兩者的區別:

Spring Task

  • Spring Task 是 Spring 框架自帶的一個任務調度模塊,提供了基本的任務調度功能。
  • 它是通過 Java 的 Timer 和 TimerTask 類來實現的,這兩個類提供了一種簡單的方式來安排和執行重復性任務。
  • Spring Task 可以通過@Scheduled注解將方法標記為定時任務,并指定任務的觸發條件、執行時間間隔等屬性。
  • Spring Task 適用于簡單的定時任務和重復性任務,但在處理復雜任務、并發任務或需要更高級功能的場景下有限。

Spring Scheduler

Spring Scheduler 也稱為 Spring Scheduling。

  • Spring Scheduling 是 Spring 框架對任務調度的一種增強支持,建立在 Spring Task 基礎上。
  • 它使用了一個更強大、靈活且可擴展的任務調度器接口,例如TaskSchedulerThreadPoolTaskScheduler
  • Spring Scheduling 提供了比 Spring Task 更多的特性和配置選項,如異步執行任務、并發控制、任務取消和動態調度等。
  • 它還提供了更多的任務觸發選項和靈活的表達式語法,例如 Cron 表達式。

總結起來,Spring Task 是 Spring 框架自帶的一個簡單任務調度模塊,提供了基本的定時任務功能;而 Spring Scheduling 是對任務調度的增強支持,提供了更多特性和配置選項,適用于更復雜的任務調度需求。如果您只需要簡單的定時任務,可以使用 Spring Task;如果需要更豐富的任務調度功能,可以選擇 Spring Scheduling。

本組件簡介

大家都知道 Spring Scheduler 好用和怎么用,但它沒有一個像 XXL-Job 有個后臺界面的,好像不太完整,于是筆者打算為 Spring Scheduler 提供一個可視化的操作界面,雖然趕不上 XXL-Job 那么強大,但也算彌補其中缺失的一環。它支持在線監控執行的任務、支持動態修改任務狀態、暫停/恢復任務,以及終止運行中任務。

另外本組件的特色就是非常簡單,或者說“輕量級”,只有兩個主要的類和一個前端靜態 html 組成,Java 的話總共不超過 500 行代碼。

核心原理

我們先進入原理層面談談(如果讀者覺得太難可以先略過)。

  • 核心 ScheduleHandler 類,連完整的注釋才 160 行。其作用如下:
    • 主要圍繞 Spring 核心原理,從加載機制中得到哪些是定時器的方法,收集起來以便統一管理
    • 如何對任務控制呢?通過ScheduledTaskScheduledFuture,可以擴展實現動態修改任務狀態、暫停/恢復任務,以及終止運行中任務。ScheduledTask 表示所有被@Scheduled注解修飾的任務
    • 如何得到 ScheduledTask 對象呢?這就涉及 Spring 加載機制了。眾所周知,Spring 是一個開放系統,暴露了大量開放的接口供用戶使用。其中原理我們不妨看看 ScheduleHandler源碼就知道。
  • 控制器ScheduledController,這是提供 API 接口的。任務可以得到了,可是怎么對其管理呢?我們很自然地想到用數據庫來進行 CRUD 的管理,但問題又來了,Spring 任務連個名稱或者 id 都沒有,怎么做數據庫管理呢?筆者想了下,就是通過類名稱和執行方法組成唯一的條件,就是一個獨特的任務記錄,可以進行入庫和管理。這個類除了調用上述的 Spring ScheduledTask API 外,還有涉及的數據庫的 CRUD 操作。其中一個怎么停止任務的地方,比較巧妙地說。
  • 前端 task.html,如下圖所示,非常簡單,
    在這里插入圖片描述
    就一個 HTML,僅僅依賴 vue.js(CDN 加載),而且 js/css 全在 HTML 里面,都是原生手寫的,直接雙擊瀏覽器打開即可使用(當然你接口前提必須是跨域的)。非常方便你整合。

后端依賴的話,是我的框架AJAXJS,當然是非常輕量級的,連 MyBatis 都沒依賴。如果你不打算依賴 AJAXJS,把這兩個類摳出來也是非常簡單的。

另外,該組件在 Spring MVC 5 下調試通過,無須 Spring Boot 亦可。

源碼在:https://gitee.com/sp42_admin/ajaxjs/tree/master/aj-backend/aj-framework/aj-framework/src/main/java/com/ajaxjs/framework/spring/scheduled。

使用配置

Spring 工程配置如下:

// 初始化 Spring 任務調度器
@Bean
public ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();pool.setCorePoolSize(5); // 指定線程數pool.setMaxPoolSize(10);pool.setWaitForTasksToCompleteOnShutdown(true);return pool;
}// 初始化任務調度管理
@Bean(initMethod = "init")
public ScheduleHandler scheduleHandler() {return new ScheduleHandler();
}// 注入任務調度的控制器
@Bean
public ScheduledController scheduledController() {return new ScheduledController();
}

前端頁面源碼在這里。你要簡單修改下接口地址什么的。

使用限制

對于固定頻率的,fixedRate,因為不能獲取其類和方法,故不能加入到任務管理中

//每隔2秒執行一次
@Scheduled(fixedRate = 2000)
public void testTasks() {System.out.println("定時任務執行時間:" + dateFormat.format(new Date()));
}

但幸運地,可以轉化為 Cron 表達式的,

@Scheduled(cron = "0/2 * * * * *") // cron 表達式,每5秒執行
public void doTask() {System.out.println("我是定時任務~" + ATOMIC_LONG.getAndIncrement());
}

參考

  • 從零搭建開發腳手架 基于Spring Task實現動態管理任務 和本文一個思想,但它的好像對 Task 包了一層,顯得有點復雜。不過考慮到高并發的設計
  • Spring Boot Task 定時任務升級(啟動、停止、變更執行周期) 說原理的
  • @Scheduled定時任務管理界面 本組件就是從它啟發的!——大幅度重構
  • Schedule 調度系統設計(單機版) 可惜看不到源碼了
  • 輕量級分布式任務調度框架 Light Task Schedule 這個其實很龐大跟復雜,看看就好
  • 在線Cron表達式生成器
  • SandGlass 是一款為 java 設計的分布式任務調度工具

其他同類的界面參考:

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

python獲取音樂文件

瀏覽器打開音樂地址 http://www.htqyy.com/top/hot 點擊第一首歌曲,會打開新的網頁并且可以獲取 改歌曲的id,就是url中的33 在播放頁面點擊F12,打開開發者調試功能 如下圖所示,在script腳本中可以獲取歌曲的下載數據 host&#…

滑模控制器理論推導和matlab/simulink實例分享

滑模控制的運動軌跡主要分為兩個方面:(1)系統的任意初始狀態向滑模面運動階段;(2)系統到達滑模面后并且慢慢趨于穩定的階段。所以,對于滑模變結構控制器的設計,對應于系統運動的兩個階段,可以分為兩個部分:…

從規劃到落地,數字化工廠如何破局

隨著第四次工業革命的推進,數字化工廠解決方案已經成為制造業轉型升級的必經之路。然而,在實際推進過程中,許多企業卻面臨著規劃難以落地、投資回報率低、人才短缺等問題。如何破局,實現數字化工廠的順利轉型,成為制造…

卡爾曼濾波

初見Kalman 假設我養了一只豬: 一周前,這只豬的體重是460.5kg。注意,在這里我用了0.5,表示其實我對這只豬一周前的體重并不是那么確定的,也就是說,46kg這個體重有0.5kg的誤差。現在,我又養了這只…

Java基礎(十二)面向對象編程 OOP

一、抽象數據類型 1.面向對象基本概念 1. 面向對象 面向對象程序設計(OOP)是一種基于對象概念的軟件開發方法,是目前軟件開發的主流方式。 常見面向對象的語言:C 、Python 、Java 常見面向過程的語言:C 面向對象的三…

計算機競賽 python+opencv+機器學習車牌識別

0 前言 🔥 優質競賽項目系列,今天要分享的是 🚩 基于機器學習的車牌識別系統 🥇學長這里給一個題目綜合評分(每項滿分5分) 難度系數:4分工作量:4分創新點:3分 該項目較為新穎,適…

使用插件實現pdf,word預覽功能

效果 代碼&#xff1a; 插件地址&#xff1a; https://github.com/501351981/vue-office <a-modalv-model:visible"visible":title"title"ok"handleOk":bodyStyle"bodyStyle":width"1200":maskClosable"false"…

如何在Vue表單處理中實現表單的條件渲染

在Vue開發中&#xff0c;我們經常會遇到需要根據某些條件來渲染表單的情況。這種情況下&#xff0c;我們需要靈活地根據條件來展示或隱藏一些表單字段。本文將介紹如何在Vue中實現表單的條件渲染&#xff0c;并提供了代碼示例。 一、使用v-if指令實現簡單的條件渲染 在Vue中&a…

2023年網絡安全比賽--綜合滲透測試(超詳細)

一、競賽時間 180分鐘 共計3小時 二、競賽階段 競賽階段 任務階段 競賽任務 競賽時間 分值 1.掃描目標靶機將靶機開放的所有端口,當作flag提交(例:21,22,23); 2.掃描目標靶機將靶機的http服務版本信息當作flag提交(例:apache 2.3.4); 3.靶機網站存在目錄遍歷漏洞,請將…

Linux設備樹詳解

Linux 設備樹詳解 Linux 操作系統早期是針對個人電腦設備而開發的操作系統&#xff0c;而個人電腦處理器產商較為單一&#xff08;例如只有 Intel&#xff0c;AMD&#xff09;同時個人電腦產商均使用 Intel 或 AMD 制造的處理器&#xff0c;業界形成了統一的總線/硬件接口標準…

JavaScript進階 第二天

深入對象內置構造函數 一. 深入對象 創建對象三種方式構造函數實例成員&靜態成員 1.1 創建對象三種方式 ① 利用對象字面量創建對象 const o {name: 哈哈 } ② 利用new Object 創建對象 const o new Object({ name: 哈哈 }) ③ 構造函數創建對象 1.2 構造函數 …

探索規律:Python地圖數據可視化藝術

文章目錄 一 基礎地圖使用二 國內疫情可視化圖表2.1 實現步驟2.2 完整代碼2.3 運行結果 一 基礎地圖使用 使用 Pyecharts 構建地圖可視化也是很簡單的。Pyecharts 支持多種地圖類型&#xff0c;包括普通地圖、熱力圖、散點地圖等。以下是一個構建簡單地圖的示例&#xff0c;以…

認識Transformer:入門知識

視頻鏈接&#xff1a; https://www.youtube.com/watch?vugWDIIOHtPA&listPLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index60 文章目錄 Self-Attention layerMulti-head self-attentionPositional encodingSeq2Seq with AttentionTransformerUniversal Transformer Seq2Seq …

淺談 EMP-SSL + 代碼解讀:自監督對比學習的一種極簡主義風

論文鏈接&#xff1a;https://arxiv.org/pdf/2304.03977.pdf 代碼&#xff1a;https://github.com/tsb0601/EMP-SSL 其他學習鏈接&#xff1a;突破自監督學習效率極限&#xff01;馬毅、LeCun聯合發布EMP-SSL&#xff1a;無需花哨trick&#xff0c;30個epoch即可實現SOTA 主要…

08 qt進程和網絡編程(cs模型)

一 、qt進程 qt中進程最主要的任務就是啟動額外應用程序 并且跟他們之間通信。進程類為QProcess 定義用途Header:#include qmake:QT += coreInherits:QIODevice//繼承于IO設備類1.1 QProcess基本使用 第一步:創建一個QProcess對象 // process = new QProcess(this); //說明…

資訊速遞 | ArkUI-X 預覽版已正式開源!

OpenHarmony項目群技術指導委員會&#xff08;以下簡稱“TSC”&#xff09;-跨平臺應用開發框架TSG所孵化項目 —— ArkUI-X&#xff0c;近期已正式開源 &#xff0c;開發者基于一套主代碼&#xff0c;就可以將在OpenHarmony上開發的精美、高性能應用同時運行在Android、iOS等其…

LNMP環境搭建wordpress以及跳轉后臺報404解決

基于上文配置好的LNMP環境繼續搭建wordpress 目錄 一.到官網下載tar.gz包&#xff0c;并上傳到Linux上&#xff0c;也可以通過復制鏈接地址進行下載 二. 將wordpress中的所有文件移動到你nginx.conf中指定目錄中 三.為wordpress配置數據庫 四.到瀏覽器進行注冊 1.剛開始…

maven編譯始終提示無效的目標發行版的解決方法

摘自個人印象筆記2021-05-07&#xff1a;https://app.yinxiang.com/fx/55e1d5f4-aeea-446a-a768-0f1a48195f5b(圖顯示不完整可查看原筆記內容)1&#xff1a;確保IDE中的編譯版本正確 在idea中&#xff0c;主要看項目屬性中和setting的java compiler中對應的jdk版本是否正確&…

好用的安卓手機投屏到mac分享

工具推薦&#xff1a;scrcpy github地址&#xff1a;https://github.com/Genymobile/scrcpy/tree/master mac使用方式 安裝環境&#xff0c;打開terminal&#xff0c;執行以下命令&#xff0c;沒有brew的先安裝brew brew install scrcpy brew install android-platform-too…

學習 Iterator 迭代器

今天看到一個面試題&#xff0c; 讓下面解構賦值成立。 let [a,b] {a:1,b:2} 如果我們直接在瀏覽器輸出這行代碼&#xff0c;會直接報錯&#xff0c;說是 {a:1,b:2} 不能迭代。 看了es6文檔后&#xff0c;具有迭代器的就一下幾種類型&#xff0c;沒有Object類型&#xff0c;…