作業調度框架 Quartz.NET 2.0 教程
現今的系統,業務數據是越來越大,傳統的同步處理方式有時候已經不能滿足用戶需求,定時后臺服務這種異步數據處理形式則逐漸被大家接受。相信大家在平時的工作中也經常遇到數據同步,或是定時郵件,短信提醒等需求,Quartz.net(官網 http://quartznet.sourceforge.net/)可以很好滿足對多個windows服務的管理及監控,同時在保證開發簡單的情況下不失靈活,是非常優秀的作業調度框架。
和其他絕大多數開源項目一樣Quartz.net也包含了其他幾個優秀的開源項目:
核心 ----Common.Logging(通用日志接口)
----C5(泛型集合類)
示例程序
----log4net(日志記錄-通用日志接口實現)
----topshelf(跨平臺服務宿主程序)
Quartz.net使用的許可是Apache License,商業友好,使用者可以修改源碼用于開源或商業項目,只需包含許可及修改說明。
Scheduler ---------主調度程序 --------- Quartz核心
Job ---------作業 --------- 服務要做的(業務操作)
Trigger ---------觸發器 --------- 服務執行條件(何時執行操作)
Listener ---------事件監聽器 --------- 執行期事件(Job執行前后/ Scheduler啟動終止暫停時應該做什么,可以掛一些特定事件)
了解了這些概念之后,我們就可以組合這些概念并整理出開發的思路:
先利用SchedulerFactory構建一個Scheduler,啟動Scheduler,之后構建Job和Trigger,若有作業監聽需求,在Listener上添加相應的處理程序,再將Job和Trigger關聯后放入Scheduler
3. Quartz.net的簡單使用
1. 新建一個控制臺程序,引用Quartz.dll和Common.Logging.dll
2. 新建一個類,命名為SampleJob,繼承并實現接口Quartz.IJob
public class SampleJob : IJob { public void Execute(IJobExecutionContext context) { File.AppendAllText( "C:\\Quartz.txt" , "SampleJob Is Run" ); File.AppendAllText( "C:\\Quartz.txt" , Environment.NewLine); } } |
3.在Program.cs的main方法中寫如下代碼后運行這個控制臺會程序會發現已經SampleJob中的Execute方法已經執行
static void Main( string [] args) { ISchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = factory.GetScheduler(); scheduler.Start(); IJobDetail job = JobBuilder.Create<SampleJob>().WithIdentity( "SampleJob" , "JobGroup1" ).Build(); ITrigger trigger = TriggerBuilder.Create().StartNow().Build(); scheduler.ScheduleJob(job, trigger); } |
4. 使用topshelf創建WINDOWS服務
注:此部分張善友同學已經寫過 (http://www.cnblogs.com/shanyou/archive/2011/05/04/2037008.html),此節為保證思路連貫,簡單介紹并引用部分代碼
也許有的網友會疑問,以控制臺程序作為服務宿主還沒有意義的,這時輪到Topshelf出場了, 使用它可以很方便的構建跨平臺服務寄主,而在調試時直接以控制臺的形式運行即可,非常方便。 我們引入topshelf.dll及 log4net.dll(topshelf需要),將之前main中代碼放到服務類里,把main方法變為Host構建
服務類代碼:
public class SampleService { ISchedulerFactory factory; IScheduler scheduler; public void Start() { File.AppendAllText( "C:\\Quartz.txt" , "SampleService Is Run" ); File.AppendAllText( "C:\\Quartz.txt" , Environment.NewLine); factory = new StdSchedulerFactory(); scheduler = factory.GetScheduler(); scheduler.Start(); IJobDetail job = JobBuilder.Create<SampleJob>().WithIdentity( "SampleJob" , "JobGroup1" ).Build(); ITrigger trigger = TriggerBuilder.Create().StartNow().Build(); scheduler.ScheduleJob(job, trigger); } public void Stop() { scheduler.Clear(); File.AppendAllText( "C:\\Quartz.txt" , "SampleService Is Stop" ); File.AppendAllText( "C:\\Quartz.txt" , Environment.NewLine); } } |
修改后的Main代碼
static void Main( string [] args) { var host = HostFactory.New(x => { x.EnableDashboard(); x.Service<SampleService>(s => { s.SetServiceName( "SampleService" ); s.ConstructUsing(name => new SampleService()); s.WhenStarted(tc => { tc.Start(); }); s.WhenStopped(tc => tc.Stop()); }); x.RunAsLocalSystem(); x.SetDescription( "SampleService Description" ); x.SetDisplayName( "SampleService" ); x.SetServiceName( "SampleService" ); }); host.Run(); } |
編譯后,cmd進到exe所在目錄,并執行"項目名.exe install/uninstall" 完成服務的安裝與卸載
來自:http://www.cnblogs.com/Magicsky/archive/2012/02/07/2341637.html