先說一下近況吧;最近在寫定時器相關的東西,本身公司有一套定時器的東西,是通過Timer去喚起ScheduleScheduledTreadPoolExector的定時器線程池去實現定時調度的,此方法的好處就是在後臺任務中處理的表現較優點,想象一下如每天下載訂單信息,定時上傳數據信息等等操作,定時任務不是很複雜的東西很容易實現,其二的優點就是已經被集成到公司的框架中,實現起來較爲方便
此次由於定時器任務有延遲任務,公司的類庫框架已經不能夠滿足了,調研了一下,發現Quertz可以實現,並且之前自己也實現過小DEMO,所以這次就選擇這個框架進行業務處理;
以下是一些總結、文末帶上一些參考資料
-
框架:quertz.jar
-
版本:2.2.2
Quertz基礎知識:,個人覺得這篇文檔總結的最好,可以先看看這個文檔,對下面的閱讀有幫助
1 Quertz 持久化和非持久化
持久化
-
1: 使用Quertz自己的表
Quertz默認是支持持久化操作的,這個在官方文檔已經提供了具體的表結構;這裏不在描述,其他博客都有講,表結構下載地址:下載完資料,裏面有建表的SQL 文章介紹地址:Spring框架下持久化操作,創建完之後,需要自己重寫quertz的配置文件quertz.properties文件,如下頁面;除了數據庫地址,可以參考以下配置
-
2: 使用自己公司的業務表
很多公司都有自己的定時器,我司也有,所以我採取的是這種方式;在系統初始化的時候,將所有的需要裝載到Quertz定時器的數據從數據庫加載到Quertz內存中,實現定時調度;各大博客文檔中spring版本居多;感興趣的自己去搜索,Spring動態定時器如果不基於Spring的做法,其實也很簡單,就像我剛纔所說,在內存中提供一個全局的Schedule對象調用
有了這個對象之後,就可以使用這個對象生成不同的Job和trigger了;
非持久化:
- 1 Quertz默認的位置文件 quertz-perperties 默認使用的是 RAMJobStore,這個job類型就是非持久化的;
一旦應用程序結束,定時器也就結束了;
2 定時器監聽器
這篇文章已經介紹的非常詳細了,有興趣的同學自己看看(個人建議還是非常有必要),可以利用quertz的監聽器起到數據的監聽作用,能夠同步更新數據的狀態;
3 trigger 相關的設置
首先看看我司設置的定時器
涉及到執行間隔頻率(按照天、周(指定天)、月(指定天數))、每天的執行頻率、已經調度器的執行區間、
循環執行部分都可以使用DailyTimeIntervalSchedulerBuilder類來實現,其中必要麻煩的是 間隔週和間隔月份
間隔週、間隔月的處理辦法
間隔週:DailyTimeIntervalSchedulerBuilder.dailytimeIntervalSchedule().onDaysOfWeek(/這裏這是需要執行的天數就可以/)
間隔月:使用monthlyCalendar,計算需要統計的日期(true表示排除、false表示包含天數)
最後修改當前trigger的日期就可以:trigger.modifedCalendar(info.getPlanId); 即可
參考資料: