Net作業排程(三) — Quartz.Net進階

蘑菇先生發表於2014-11-17

介紹

前面介紹Quartz.Net的基本用法,但在實際應用中,往往有更多的特性需求,比如記錄job執行的執行歷史,發郵件等。

閱讀目錄

  1. Quartz.Net外掛
  2. TriggerListener,JobListener
  3. Cron表示式
  4. Quartz.Net執行緒池
  5. 總結

Quartz.Net外掛

     Quartz.net 自身提供了一個外掛介面(ISchedulerPlugin)用來增加附加功能,看下官方定義:

  public interface ISchedulerPlugin
    {
        void Initialize(string pluginName, IScheduler sched);
       //關閉排程器
        void Shutdown();
        //外掛啟動
        void Start();
    }

 繼承介面,實現自己的外掛。

 public class MyPlugin : ISchedulerPlugin
    {
        public void  Initialize(string pluginName, IScheduler sched)
        {
            Console.WriteLine("例項化");
        }
        public  void Start()
        {
             Console.WriteLine("啟動");
        }
        public  void Shutdown()
        {
            Console.WriteLine("關閉");
        }
    }

  主函式裡面配置要實現的外掛,註釋部分,一句話搞定。

static void Main(string[] args)
        {
            var properties = new NameValueCollection();
           //MyPlugin 自定義名稱。    "名稱空間.類名,程式名稱"
            properties["quartz.plugin.MyPlugin.type"] = "QuartzDemo3.MyPlugin,QuartzDemo3"; 

            var schedulerFactory = new StdSchedulerFactory(properties);
            var scheduler = schedulerFactory.GetScheduler();

            var job = JobBuilder.Create<HelloJob>()
                .WithIdentity("myJob", "group1")
                .Build();

            var trigger = TriggerBuilder.Create()
                                .WithIdentity("mytrigger", "group1")
                                .WithCronSchedule("/2 * * ? * *")
                                .Build();

            scheduler.ScheduleJob(job, trigger);
            scheduler.Start();
            Thread.Sleep(6000);
            scheduler.Shutdown(true);
            Console.ReadLine();

        }

執行結果如下:

 

TriggerListener,JobListener

這2個是對觸發器和job本身的行為監聽器,這樣更好方便跟蹤Job的狀態及執行情況。  

ITriggerListener是官方定義的介面,這裡我們直接繼承實現。 

public class MyTriggerListener : ITriggerListener
    {
        private string name;

        public void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode)
        {
            Console.WriteLine("job完成時呼叫");
        }
        public void TriggerFired(ITrigger trigger, IJobExecutionContext context)
        {
            Console.WriteLine("job執行時呼叫");
        }
        public void TriggerMisfired(ITrigger trigger)
        {
            Console.WriteLine("錯過觸發時呼叫(例:執行緒不夠用的情況下)");
        }
        public bool VetoJobExecution(ITrigger trigger, IJobExecutionContext context)
        {
            //Trigger觸發後,job執行時呼叫本方法。true即否決,job後面不執行。
            return false;
        }
        public string Name { get { return name; } set { name = value; } }
    }

主函式新增:

           //新增監聽器到指定的trigger
            scheduler.ListenerManager.AddTriggerListener(myJobListener, KeyMatcher<TriggerKey>.KeyEquals(new TriggerKey("mytrigger", "group1")));

            ////新增監聽器到指定分類的所有監聽器。
            //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"));

            ////新增監聽器到指定分類的所有監聽器。
            //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"));

           ////新增監聽器到指定的2個分組。
            //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"), GroupMatcher<TriggerKey>.GroupEquals("myJobGroup2"));

            ////新增監聽器到所有的觸發器上。
            //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.AnyGroup());

            scheduler.Start();

JobListener同理,這裡不多做描述。

Cron表示式

quartz中的cron表示式和Linux下的很類似,比如 "/5 * * ? * * *"  這樣的7位表示式,最後一位非必選。

表示式從左到右,依此是秒、分、時、月第幾天、月、周幾、年。下面表格是要遵守的規範:

欄位名允許的值允許的特殊字元
Seconds 0-59 , - * /
Minutes 0-59 , - * /
Hours 0-23 , - * /
Day of month 1-31 , - * ? / L W
Month 1-12 or JAN-DEC , - * /
Day of week 1-7 or SUN-SAT , - * ? / L #
Year 空, 1970-2099 , - * /

 

 

 

 

 

 

特殊字元 解釋
, 或的意思。例:分鐘位 5,10  即第5分鐘或10分都觸發。 
/ a/b。 a:代表起始時間,b頻率時間。 例; 分鐘位  3/5,  從第三分鐘開始,每5分鐘執行一次。
* 頻率。 即每一次波動。    例;分鐘位 *  即表示每分鐘 
- 區間。  例: 分鐘位   5-10 即5到10分期間。 
? 任意值 。   即每一次波動。只能用在DayofMonth和DayofWeek,二者衝突。指定一個另一個一個要用?
L 表示最後。 只能用在DayofMonth和DayofWeek,4L即最後一個星期三
W 工作日。  表示最後。 只能用在DayofWeek
# 4#2。 只能用DayofMonth。 某月的第二個星期三  

 

 

 

 

 

 

 

 

 

 

例項介紹

”0 0 10,14,16 * * ?"    每天10點,14點,16點 觸發。

"0 0/5 14,18 * * ?"    每天14點或18點中,每5分鐘觸發 。

"0 4/15 14-18 * * ?"       每天14點到18點期間,  從第四分鐘觸發,每15分鐘一次。

"0 15 10 ? * 6L"        每月的最後一個星期五上午10:15觸發。

Quartz.Net執行緒池

執行緒池數量設定:

properties["quartz.threadPool.threadCount"] = "5";  

這個執行緒池的設定,是指同時間,排程器能執行Job的最大數量。

quartz是用每個執行緒跑一個job。上面的設定可以解釋是job併發時能執行5個job,剩下的job如果觸發時間恰好到了,當前job會進入暫停狀態,直到有可用的執行緒。

如果在指定的時間範圍依舊沒有可用執行緒,會觸發misfired時間。

quartz 提供了IThreadPool介面,也可以用自定義執行緒池來實現。

配置如下:

properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; 

一般來說作業排程很少併發觸發大量job,如果有上百個JOB,可在伺服器承受範圍內適量增加執行緒數量。     

總結

官方有LoggingTriggerHistoryPlugin,LoggingJobHistoryPlugin  已實現的,觸發器和job歷史記錄的外掛。

Quartz.Plugin 名稱空間下有官方實現的其他一些外掛,也可以自己增加擴充套件。

quartz中監聽器還有SchedulerListener,使用方法基本一樣。 

本文基於自用經驗和官方文件程式碼來寫的,部分是直接翻譯的。 

Quartz.Net官方教程http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html

 

相關文章