注:目前網上諸多介紹Quartz.net的文章,甚至Quartz.net官網上的Tutorial都是1.0版本的,而這個項目在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方法已經執行

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" 完成服務的安裝與卸載