定時任務是網際網路行業裡最常用的服務之一,本文給大家介紹定時任務在我司的發展曆程。
linux系統中一般使用crontab指令來實作,在java世界裡,使用最廣泛的就是quartz了。我司使用quartz就已經更新了三代,每一代在上一代系統之上有所優化,寫這篇文章一方面介紹一下quartz的使用,另一方面可以根據此項目的變遷反應出我司平台架構更新的一個縮影。
定時任務的使用場景很多,以我們平台來講:計息,派息、對賬等等。
quartz 介紹
quartz是個開源的作業排程架構,為在java應用程式中進行作業排程提供了簡單卻強大的機制。quartz允許開發人員根據時間間隔(或天)來排程作業。它實作了作業和觸發器的多對多關系,還能把多個作業與不同的觸發器關聯。quartz可以內建幾乎任何的java應用程式—從小的單片機系統到大型的電子商務系統。quartz可以執行上千上萬的任務排程。
quartz核心的概念:scheduler任務排程、job任務、jobdetail任務細節、trigger觸發器
scheduler:排程器,排程器接受一組jobdetail+trigger即可安排一個任務,其中一個jobdetail可以關聯多個trigger
job:job是任務執行的流程,是一個類
jobdetail:jobdetail是job是執行個體,是一個對象,包含了該執行個體的執行計劃和所需要的資料
trigger:trigger是定時器,決定任務何時執行
使用quartz排程系統的思路就是,首先寫一個具體的任務(job),配置任務的觸發時間(trigger),scheduler很根據jobdetail+trigger安排去執行此任務。
quartz 定時器的時間設定
時間的配置如下:0 30 16 ?
時間大小由小到大排列,從秒開始,順序為 秒,分,時,天,月,年 *為任意 ?為無限制。由此上面所配置的内容就是,在每天的16點30分啟動buildsendhtml() 方法
具體時間設定可參考 :
“0/10 ?” 每10秒觸發
“0 0 12 ?” 每天中午12點觸發 “0 14 * ?” 在每天下午2點到下午2:59期間的每1分鐘觸發
“0 10,44 14 ? 3 wed” 每年三月的星期三的下午2:10和2:44觸發
“0 15 10 ? * mon-fri” 周一至周五的上午10:15觸發
“0 0 06,18 ?” 在每天上午6點和下午6點觸發
第一代定時任務系統
第一代定時任務系統使用的很簡單,全部按照當時spring推薦的配置方式來進行,開發于2014年初。
首先在配置線程池
配置定時任務工廠和任務基類
machineid:機器編碼
recorderrordetail:是否記錄詳細日志
通過timerfactory 來擷取具體的任務和觸發器
basetask內建了task,在裡面做了一些基礎的業務,比如定時任務開始執行的時候記錄定時任務的開始執行時間,定時任務結束的時候記錄執行的結果等。
配置具體的定時任務。以重發短信郵件的定時任務為例
resendsmsandemailtask:具體的定時任務類
resendsmsandemailjob:包裝成具體的job
resendsmsandemailtrigger:設定具體執行的時間,包裝成trigger
具體的task類,删掉了部分業務代碼:
最後配置scheduler任務排程
dynamicjobassembler類代碼:
定時任務表,執行的時候以表裡面的資料為準,友善編輯。
這就是我們第一代定時任務系統,達到了定期執行定時任務的效果,但是同樣有兩個缺點:
1、定時排程和業務代碼耦合在一起
2、每次調整定時任務的時間需要重新開機服務
作者:純潔的微笑