Quartz 任務調度框架源碼閱讀解析

概念: quartz 是一個基于JAVA的定時任務調度框架

案例:?

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version></dependency>JobDetail job = JobBuilder.newJob(SchedulerTs.class).withIdentity("job1", "group1").usingJobData("name", "zs").build();Date endDate = DateUtils.addMinutes(new Date(), 2);SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "triggerGroup").withSchedule(SimpleScheduleBuilder.simpleSchedule()// 任務執行間隔.withIntervalInSeconds(10)// 重復執行次數.withRepeatCount(10)).forJob(job).endAt(endDate).startNow().build();StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();// 配置任務scheduler.scheduleJob(job, trigger);scheduler.start();

使用、上手難度: 簡單

效果已經實現了、那么這個是怎么實現的呢、很費解、所以花了一早上時間扒了扒源碼、解惑

首先介紹幾個關鍵的類:?


????????StdSchedulerFactory 調度工廠、Scheduler 調度工具(類)、QuartzSchedulerThread 任務執行線程、SchedulerRepository 單例的調度倉庫 、?JobDetail 任務job封裝接口、SimpleTrigger 觸發器

????????現在看著有點多、記不住. 藍色部分忽略、他只是建造者模式的應用、封裝了 很多屬性方法、SchedulerRepository?單例的調度倉庫 也可以忽略、他只是一個map 用來存放 調度類的,并且也能夠避免相同調度類的重復創建;

????????重頭戲: 找到切入點?StdSchedulerFactory 調度工廠 是如何獲取到 調度類?Scheduler 的,并且?Scheduler.start? ?scheduleJob?方法做了什么,我認為看懂這兩塊,基本就算差不多了

????????創建?StdSchedulerFactory 對象,只是一個空對象,什么也沒有做、關鍵點在于StdSchedulerFactory 的 getScheduler? 方法, 我們先看源碼

????????到現在比較明了了. 主要工作在 initialize 方法 和 instantiate 方法做的,我們逐個分析
????????initialize 源碼.只粘貼關鍵代碼. 實際上他也只是做了文件解析、將文件中的配置信息交給Properties,然后將 配置信息交給 工廠類的屬性 cfg 對象.這個對象只是在properties 外面封裝了一層.本質還是一個properties、配置信息包含一些線程數、執行間隔啥的. 這個就是配置、具體不做討論

????????instantiate 源碼、這個方法做的 任務比較多、涉及到 QuartzSchedulerThread 類的創建和啟動、調度倉庫調度器的插入、前面的配置信息就是在這一步裝配到任務上的,廢話不多說、直接看源碼

????????現在又會有一個疑惑、一個線程執行一次就結束了、他怎么做到一直監聽到有新任務進來的呢? 關鍵在于 一個while 循環 和?sigLock 對象的?awaitnotifyAll 操作,下面圖放了 這個線程run方法的動作,?到現在已經明確?instantiate 執行完之后線程就是已經啟動的了

????????現在我們再去看看?StdSchedulerFactory 的?scheduleJob?方法做了啥,將當前任務 保存到了 triggersByKey?和 jobsByKey?中 ,然后?交給了 listener 和 plugs 監聽處理

????????最后一步、啟動 StdSchedulerFactory.start

????????通過 sigLocknotifyAll 通知 quartzSchedulerThread 線程繼續執行.

????????自己實現的任務是在何時被調用的呢??QuartzSchedulerThread::run 來尋找答案

????????新建的shell 是一個線程、initialize 關鍵步驟,newJob

????????找到了、反射 實例話 job類、得到了我們寫好的對象
????????runThread(shell) 執行了 shell 線程,run方法做了什么 我們看下,job.execute 任務被執行了.
完美,我看到的是這樣如果有疏漏麻煩評論區指正,感激,結尾附上思維導圖、相對來說更加詳細

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

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

相關文章

每日一練 | 華為認證真題練習Day191

1、在沒有啟用BGP路徑負載分擔的情況下&#xff0c;哪種BGP路由會發送BGP鄰居? A. 從所有鄰居學到的所有BGP路由。 B. 只有從IBGP學到的路由。 C. 只有從EBGP學到的路由。 D. 只有被BGP優選的最佳路由。 2、第三類LSA的LINK ID是 A. 生成這條LSA的路由器的ROUTER ID B. …

LeetCode 刷題 [C++] 第236題.二叉樹的最近公共祖先

題目描述 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為&#xff1a;“對于有根樹 T 的兩個節點 p、q&#xff0c;最近公共祖先表示為一個節點 x&#xff0c;滿足 x 是 p、q 的祖先且 x 的深度盡可能大&#xff08;一個節點也可以…

大數據分析案例-基于SVM支持向量機算法構建手機價格分類預測模型

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

矩陣爆破逆向之條件斷點的妙用

不知道你是否使用過IDA的條件斷點呢&#xff1f;在IDA進階使用中&#xff0c;它的很多功能都有大作用&#xff0c;比如&#xff1a;ida-trace來跟蹤調用流程。同時IDA的斷點功能也十分強大&#xff0c;配合IDA-python的輸出語句能夠大殺特殺&#xff01; 那么本文就介紹一下這…

【JAVA】JDK內置工具之appletviewer

下載java 下載java的時候會先下載Java jdk&#xff0c;Java Development Kit Java開發工具包。 然后會下載jre&#xff0c;也就是Java Runtime Environment Java運行環境。什么是JDK、JRE&#xff1f;_java中的jdk,jre代表什么-CSDN博客 下載之后先找到java下的bin文件&#x…

yolov9 tensorRT 的 C++ 部署

yolov9 tensorRT C 部署 本示例中&#xff0c;包含完整的代碼、模型、測試圖片、測試結果。 完整的代碼、模型、測試圖片、測試結果【github參考鏈接】 TensorRT版本&#xff1a;TensorRT-7.1.3.4 導出onnx模型 導出適配本實例的onnx模型參考【yolov9 瑞芯微芯片rknn部署、地平…

網絡爬蟲的危害,如何有效的防止非法利用

近年來&#xff0c;不法分子利用“爬蟲”軟件收集公民隱私數據案件屢見不鮮。2023年8月23日&#xff0c;北京市高級人民法院召開北京法院侵犯公民個人信息犯罪案件審判情況新聞通報會&#xff0c;通報侵犯公民個人隱私信息案件審判情況&#xff0c;并發布典型案例。在這些典型案…

獲取PDF中的布局信息——如何獲取段落

PDF解析是極其復雜的問題。不可能靠一個工具解決全部問題&#xff0c;尤其是五花八門&#xff0c;格式不統一的PDF文件。除非有鈔能力。如果沒有那就看看可以分為哪些問題。 提取文本內容&#xff0c;提取表格內容&#xff0c;提取圖片。我認為這些應該是分開做的事情。python有…

百度百科數據爬取 python 詞條數據獲取

最近需要補充一些電力名詞的解釋&#xff0c;尤其是文字相關內容。百度百科上的詞條質量有差異&#xff0c;因此我們需要先手工選擇一些高質量詞條。 假設我們選擇了互感器頁面中的儀用變壓器詞條&#xff0c;首先&#xff1a; import requests from bs4 import BeautifulS…

DataSpell 2023:專注于數據,加速您的數據科學之旅 mac/win版

JetBrains DataSpell 2023是一款專為數據科學家和數據分析師設計的集成開發環境&#xff08;IDE&#xff09;。這款IDE提供了強大的數據分析和可視化工具&#xff0c;旨在幫助用戶更快速、更高效地進行數據科學工作。 DataSpell 2023軟件獲取 DataSpell 2023在保持其一貫的數…

【多線程】常見鎖策略詳解(面試常考題型)

目錄 &#x1f334; 樂觀鎖 vs 悲觀鎖&#x1f38d;重量級鎖 vs 輕量級鎖&#x1f340;自旋鎖&#xff08;Spin Lock&#xff09;&#x1f38b;公平鎖 vs ?公平鎖&#x1f333;可重?鎖 vs 不可重?鎖&#x1f384;讀寫鎖?相關面試題 常?的鎖策略 注意: 接下來講解的鎖策略不…

udp丟包問題研究

//發現udp 有收不到數據包現象. 一: 觀察丟包 1. ifconfig enp8s0 2. netstat -s -u 二: 修改系統緩存參數. recv_buffer_size 修改系統buffer_size sysctl -w net.core.rmem_max26214400 sysctl -w net.core.rmem_default26214400 三: 應用程序考慮 av_dict_set(&m_o…

cpp基礎學習筆記03:類型轉換

static_cast 靜態轉換 用于類層次結構中基類和派生類之間指針或者引用的轉換。up-casting (把派生類的指針或引用轉換成基類的指針或者引用表示)是安全的&#xff1b;down-casting(把基類指針或引用轉換成子類的指針或者引用)是不安全的。用于基本數據類型之間的轉換&#xff…

【C# 】進度條控件 ProgressBar 使用

進度條控件ProgressBar控件&#xff0c;一般作為UI界面表示某個事情進行到某個程度的外觀的體現。 那么進度條控件ProgressBar控件&#xff0c;在form中是怎么使用的呢&#xff1f; 該控件必須要用的屬性如下&#xff1a; private System.Windows.Forms.ProgressBar progressB…

Flutter Version Manager (FVM): Flutter的版本管理終極指南

Flutter筆記 Flutter Version Manager (FVM) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/136300307 my-websit…

SQL-Labs靶場“26-28”關通關教程

君衍. 一、二十六關 基于GET過濾空格以及注釋報錯注入1、源碼分析2、繞過思路3、updatexml報錯注入 二、二十六a關 基于GET過濾空格注釋字符型注入1、源碼分析2、繞過思路3、時間盲注 三、二十七關 基于union及select的過濾單引號注入1、源碼分析2、繞過思路3、聯合查詢注入4、…

laravel cache

一、基本操作 Cache::put() 創建緩存&#xff08;鍵&#xff0c;值&#xff0c;有效期&#xff08;單位是秒&#xff09;&#xff09; Cache::get() 獲取緩存 Cache::add() 只會在緩存項不存在的情況下添加數據到緩存&#xff0c;如果數據被成功返回 true&#xff0c;否則&…

Android在后臺讀取UVC攝像頭的幀數據流并推送

Android在后臺讀取UVC攝像頭的幀數據流并推送 添加UvcCamera依賴庫 使用原版的 saki4510t/UVCCamera 在預覽過程中斷開可能會閃退&#xff0c;這里使用的是 jiangdongguo/AndroidUSBCamera 中修改的版本&#xff0c;下載到本地即可。 https://github.com/jiangdongguo/AndroidU…

Rust學習筆記:基礎工具和基本名詞

不要用共享內存來通信&#xff0c;要用通信來共享內存 rustup: 一個用于管理 Rust 版本和相關工具的命令行工具 rustup update cargo: Rust 的構建系統和包管理工具 構建代碼下載依賴庫并構建下載庫 crate: 代碼包/庫 trait: 特性、功能 ///: 生成 html 格式的 doc&#…

CELL文獻速遞 | 了解微生物如何在社會中傳播并塑造我們的健康

谷禾健康 當人還是嬰兒時&#xff0c;會從父母那里得到微生物&#xff1b;和寵物玩耍或接觸時&#xff0c;也會從寵物那得到微生物&#xff1b;有時候人沒有直接和動物玩耍&#xff0c;只是接觸動物的糞便&#xff0c;甚至其他環境的微生物&#xff0c;都會交換微生物... 這些其…