Quartz.NET是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。
Quartz.NET允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關系,還能把多個作業與不同的觸發器關聯。
整合了 Quartz.NET的應用程序可以重用來自不同事件的作業,還可以為一個事件組合多個作業。
官方學習文檔:http://www.quartz-scheduler.net/documentation/index.html
使用實例介紹:http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html
官方的源代碼下載:http://sourceforge.net/projects/quartznet/files/quartznet/
下面將結合我的項目中的使用給大家分享一下
- 為什么要使用Quartz?
我們經常會有這樣的應用場景:需要定時輪詢某些符合條件的數據,在達到一定條件的時候,對數據做出一定的處理,比如:電商平台要搞促銷活動,設定好活動開始時間,在到達開始時間的時候定時推一些促銷信息到網站前台。這時我們常用的方法有:windows service,console job等等方式來處理,本文以Quartz調度console job來實現。
項目的總體思路是:用Windows Service把主程序Host起來,然后通過Quartz.net的可視化界面控制Job的執行和調度
首先創建Console Job程序,下載Quartz相關的包(Quartz.NET,CrystalQuartz.Remote),通過Nuget安裝的話,相關依賴包會自動下載。
使用這個框架的最大的好處就是業務便於橫向擴展,比如目前根據業務來說我有兩個實現的功能,一個是搶購的商品到時間之后定時上下架,還有一個是超時訂單15分鍾未支付自動作廢,我在項目中新建兩個文件夾,放各自的業務處理類,其他的都是公用的。
接下來看具體的實現:
程序主入口用Service Run起來。
JobManager是添加的系統組建,里面的實現如下:
ServiceBase中的代碼很關鍵,起到配置線程池的作用,這個地方設置線程池信息是整個框架在調度的時候通用的配置
新建一個作業調度的基類:JobService,實現如下:
主要用於設置Job的名稱,作業組的名稱,還有給調度器中添加每一個作業信息和各自的觸發器信息
接下來基本的配置實現已經完成了,我們來看看具體的作業是怎么實現的?
各自的業務處理模塊的模板都和這個類似,具體可根據自己的習慣來實現。關於觸發器的配置還有另外一種做法,就是通過配置文件來實現,大家可以百度一下。
業務處理類中就根據各自不同的業務做具體的實現了,代碼如下:
項目中紀錄Log(這個很重要,非常重要)使用Nlog,數據庫訪問使用Dapper(輕量級的ORM,特別好用,性能也很好)
Job的工作已經基本完成了,接下來要做就是把添加安裝文件,將Job做成Windows Service安裝到服務器了,這個步驟就不再啰嗦了(如果不知道的童鞋可以百度,或者聯系我要源碼)
下面我們還剩最后一步,就是開始我們說的可視化控制,截至到目前我們做的都是不可見的服務,怎么用可視化的界面呈現給用戶呢?繼續往下
新建一個空的ASP.NET WebSite,安裝CrystalQuartz.Remote 包,這個可以使得你在Web站點里面訪問到框架生成的可視化界面。
安裝完包之后我們可以看到在WebConfig中添加了相關的配置,最重要的就是SchedulerHost這個配置,這個地方指定的端口號就是我們在最開始創建線程池的時候制定的Port,兒地址就是我們當前服務器部署的地址了,需要說明的一點就是我們的Windows Service部署的服務器和WebSite部署的站點是要在同一個服務器上的。
接下來就是啟動將新建的網站部署到IIS,開啟WindowsService,然后在瀏覽器里面瀏覽新的站點,在默認的端口后面直接輸入:/CrystalQuartzPanel.axd 就看訪問了
看到這么清爽的界面,很是激動人心啊,我們不用自己開發可視化的Job調度框架就可以通過界面來控制我們的服務了,是不是很心動呢?
心動不如行動啊,筒子們如果有想法就動手實踐一下,我差不多用了3個小時左右的時間來實踐了一下。Quartz框架中的其他功能暫時還沒研究。
如果在實現過程中有什么問題可以給我留言,我把源碼共享出來,大家一起研究,學習~~
示例代碼:https://github.com/KenWang007/JobScheduleDemoCode.git
https://www.cnblogs.com/Wolfmanlq/p/5873235.html