作業調度框架 Quartz.NET 2.0 教程

fmms 12年前發布 | 66K 次閱讀 Quartz 作業調度框架

1. 項目介紹

     現今的系統,業務數據是越來越大,傳統的同步處理方式有時候已經不能滿足用戶需求,定時后臺服務這種異步數據處理形式則逐漸被大家接受。相信大家在平時的工作中也經常遇到數據同步,或是定時郵件,短信提醒等需求,Quartz.net(官網 http://quartznet.sourceforge.net/)可以很好滿足對多個windows服務的管理及監控,同時在保證開發簡單的情況下不失靈活,是非常優秀的作業調度框架。

和其他絕大多數開源項目一樣Quartz.net也包含了其他幾個優秀的開源項目:

核心   ----Common.Logging(通用日志接口)

         ----C5(泛型集合類)

示例程序

         ----log4net(日志記錄-通用日志接口實現)

         ----topshelf(跨平臺服務宿主程序)

  Quartz.net使用的許可是Apache License,商業友好,使用者可以修改源碼用于開源或商業項目,只需包含許可及修改說明。

2. Quartz.net開發思路
 
  我們來了解下Quartz.net中常用的幾個概念:

  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

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!