天天看點

山寨版Quartz.Net任務統一排程架構TaskScheduler

在日常工作中,大家都會經常遇到Win服務,在我工作的這些年中一直在使用Quartz.Net這個任務統一排程架構,也非常好用,配置簡單,但是如果多個項目組的多個服務部署到一台伺服器時還是不盡如人意。

這段時間很忙,也一直未更新部落格了,趕上今天下班早,就研究了一下,弄了個簡單版基于Timer的山寨Quartz,當然了隻是實作任務排程,閑話少說直接入主題吧

其實都是普通的微軟技術,一想到這方我們第一想到的可能就是反射,本文用了MEF

第一我們建立項目TianWei.TaskScheduler

第二我們會想到給Timer加個參數,這裡建了一個 TWTimer來繼承Timer,在裡面有一個屬性為JobDetail(Job詳情實本),這樣每個TImer我們就可以把任務詳情做為參數傳入

第三建立JobDetail

第四建立Job作為根據參數判斷執行哪個Job

第五建立接口IJob,所有Job都要繼承并實作Execute

第六建立核心部分排程器,這裡用到了MEF的導入和導出

其它輔助類詳見源碼

到這裡一個任務排程架構的核心就完成了,下面我信介紹怎麼使用

第一在我們想要用到的項目要填加引用TianWei.TaskScheduler

第二在想做為任務的類繼承IJob并實作Execute方法并在類上面加上[Export(typeof(IJob))]

第三在服務程式或控制台程式中引用相關類(這裡以控制台程式測試)

第四增加配置檔案在App.config中增加<add key="JobsConfig" value="\Jobs.config"/>  在Jobs.config中增加如下配置一個任務一個JobDetail

第五增加如下代碼來初使化

第六運作程式如果Job中有輸出就可以看到效果

這裡的Cron表達式也是個山寨的,自定義的,本想解析Quartz的表達式,但是感覺太複雜了

表達式一共六位組成

第一位:秒 隻能是0-59或*

第二位:分 隻能是0-59或*

第三位:小時 隻能是0-24或*

第四位:日 隻能是0-31或* 每天執行為0

第五位:月 隻能是0-12或*

第六位:周 隻能是0-6或*

注:當第六位不為*時第三四五位失效

例:

5 0 0 * * *  每隔五秒執行

5 2 1 * * *  每隔一小時兩分鐘五秒執行

5 37 14 0 * * 每天的14:37:5執行

6 36 14 * * 2 每周二的14:36:6執行

6 36 14 20 6 * 每年6月20号14:36:6執行

6 36 14 20 0 * 每月20号14:36:6執行

 代碼位址:https://github.com/hantianwei/TaskScheduler

如果有好的改動或是意見請回報給我,代碼改動後也回傳我一份,謝謝