Quartz的理解
1.官網地址
Quartz Enterprise Job Scheduler
1.1.理論基礎
1.1.1.小頂堆
1.1.2.時間輪算法
1.鏈表或者數組實現時間輪:while-true-sleep
遍歷數組,每個下標放置一個鏈表,鏈表節點放置任務,遍歷到了就取出執行。
2.round型時間輪
任務上記錄一個round,遍歷到了就round減一,為0時取出執行。
缺點:需要遍歷所有的任務,效率較低。
3.分層時間輪(常用的方式)
使用多個不同時間維度的輪:天輪:記錄幾點執行;月輪記錄幾號執行。
月輪遍歷到了,將任務取出放到天輪里面,即可實現幾號幾點執行。
注意:Linux中cron表達式和Quartz的底層實現原理,使用的就是分層時間輪的算法。
2.Quartz的設計模式
Builder模式
Factory模式
組件模式
鏈式寫法
3.Quartz體系結構
1.任務Job
Job就是你想要實現的任務類,每一個Job必須實現org.quartz.job接口,且只需要實現接口定義的execute()方法。
2.觸發器Trigger
Trigger為你執行任務的觸發器,比如你想每天定時3點發送一份統計郵件,Trigger將會設置3點進行執行該任務。Trigger主要包含兩種SimpleTrigger和CronTrigger兩種。
3.調度器Scheduler
Scheduler為任務的調度器,它會將任務job及觸發器Trigger整合起來,負責基于Trigger設定的時間來執行Job.
3.1.重要組成
3.1.1.Job
定義:實現業務邏輯的任務接口。
Job接口非常容易實現,只有一個execute方法,類似TimerTask的run方法,在里面編寫業務邏輯。
Job實例在Quartz中的生命周期
每次調度器執行job時,它在調用execute方法前會創建一個新的job實例。 當調用完成后,關聯的job對象實例會被釋放,釋放的實例會被垃圾回收機制回收。有狀態的Job和無狀態的Job
@PersistJobDataAfterExecution注解的使用有狀態的Job可以理解為多次Job調傭期間可以持有一些狀態信息。這些狀態的信息存儲在JobDataMap中,而默認的無狀態Job每次調傭時都會創建一個新的JobDataMap。?
3.1.2.JobDetail?
JobDetail為Job實例提供了許多設置屬性,以及JobDataMap成員變量屬性,它用來存儲特定Job實例的狀態信息,調度器需要借助JobDetail對象來添加Job實例。JobDetail實例是通過JobBuilder類創建的。
重要屬性:
namegroup jobClassjobDataMap3.1.3.JobExecutionContext
JobExecutionContext是什么?
1.當Scheduler調用一個Job,就會將JobExecutionContext傳遞給Job的execute()方法;
2.Job能通過JobExecutionContext對象訪問到Quartz運行時候的環境以及Job本身的明細數據。
3.1.4.JobDataMap
1.在進行任務調度時JobDataMap存儲在JobExecutionContext中,非常方便獲取。
2.JobDataMap可以用來裝載任何可序列化的數據對象,當job實例對象被執行時這些參數對象會傳遞給它。
3.JobDataMap實現了JDK的Map接口,并且添加了一些非常方便的方法用來存取基本數據類型。
3.1.5.JobBuilder
用于聲明一個任務實例,也可以定義關于該任務的詳情比如任務名,組名等,這個聲明的實例將會作為一個實際執行的任務。
JobStore
3.1.6.Trigger
Quartz中的觸發器用來告訴調度程序作業什么時候觸發。即Trigger對象是用來觸發執行Job的。
Quartz有一些不同的觸發器類型,不過,用得最多的是SimpleTrigger和CronTrigger。
1、jobkey
表示job實例的標識,觸發器被觸發時,該指定的job實例會被執行。
2、startTime
表示觸發器的時間表,第一次開始被觸發的時間,它的數據類型是java.util.Date。
3.endTime
指定觸發器終止被觸發的時間,它的數據類型是java.util.Date。
3.1.7. SimpleTrigger觸發器
SimpleTrigger對于設置和使用是最為簡單的一種QuartzTrigger。
它是為那種需要在特定的日期/時間啟動,且以一個可能的間隔時間重復執行n次的Job所設計的。
注意事項:
1、SimpleTrigger的屬性有:開始時間、結束時間、重復次數和重復的時間間隔。
2、重復次數屬性的值可以為0,正整數、或常量SimpleTrigger.REPEAT_INDEFINITELY.
3、重復的時間間隔屬性值必須為大于0或長整型的正整數,以毫秒作為時間單位,當重復的時間間隔為0時,意味著與Trigger同時觸發執行。
4、如果有指定結束時間屬性值,則結束時間屬性優先于重復次數屬性,這樣的好處在于:當我們需要創建一個每間隔10秒鐘觸發一次直到指定的結束時間的Trigger,而無需去計算從開始到結束的所重復的次數,我們只需簡單的指定結束時間和使用REPEAT_INDEFINITELY作為重復次數的屬性值即可。
3.1.8.CronTrigger觸發器
如果你需要像日歷那樣按日程來觸發任務,而不是像SimpleTrigger那樣沒隔特定的間隔時間觸發,CronTrigger通常比SimpleTrigger更有用,因為它是基于日歷的作業調度器。
使用CronTrigger,你可以指定諸如“每個周五中午”,或者“每個工作日的9:30”或者“從每個周一、周三、周五的上午9:00到上午10:00之間每隔5分鐘” 這樣日程安排來觸發。甚至,像SimpleTrigger一樣,CronTrigger也一個startTime以指定日程從什么時候開始,也有一個(可選的)endTime以指定何時日程不再繼續。
1、Cron Expressions ---- Cron 表達式
Cron表達式被用來配置CronTrigger實例。Cron表達式是一個由7個子表達式組成的字符串。每個表達式都描述了一個單獨的日程細節。這些子表達式用空格分隔,分別表示:
1、Seconds 秒 2、Minutes 分鐘 3、Hours 小時 4、Day-of-Month 月中的天 5、Month 月 6、Day-of-week 周中的天 7、Year(optional field)年 (可選的域)3.1.9.TriggerBuilder
觸發器創建器,用于創建觸發器trigger實例。
ThreadPool
Scheduler
Calendar:一個Trigger可以和多個Calendar關聯,以排除或包含某些時間點。
監聽器:JobListener,TriggerListener,SchedulerListener。
4.SchedulerFactory
?大家都知道,一個作業,比較重要的三個要素就是Schduler,jobDetail,Trigger;而Trigger對于job而言就好比一個驅動器;沒有觸發器來定時驅動作業,作業就無法運行;而對Job而言,一個Job可以對應多個Trigger,但對應Trigger而言,一個Trigger只能對應一個job;所以一個Trigger只能被指派給一個Job;如果你需要一個更復雜的觸發計劃,你可以創建多個Trigger并指派它們給同一個Job。
4.1.Scheduler的創建方式:
4.1.1.StdSchedulerFactory
Quartz默認的SchedulerFactory
1、使用一組參數(java.util.Properties)來創建和初始化Quartz調度器 2、配置參數一般存儲在quartz.properties文件中 3、調用getScheduler方法就能創建和初始化調度器對象用法一:輸出調度器開始時間(重要:使得任務和觸發器進行關聯)
Date scheduleJob(JobDetail jobDetail,Trigger trigger)用法二:啟動任務
void start()用法三:任務調度掛起,既暫停操作
void standby()用法四:關閉任務調度
void shutdown()void shutdown(true):表示等待所有正在執行的job執行完畢之后,再關閉Scheduler;
void shutdown(false):表示直接關閉Scheduler
微信掃一掃:關注我個人訂閱號“猿小飛”,更多精彩文章在這里及時發布:
?
總結
- 上一篇: centos7.5安装influxdb-
- 下一篇: prometheus接入mysqld_e