Net作業排程(五)—quartz.net動態新增job設計

蘑菇先生發表於2015-01-19

介紹

在實際專案使用中quartz.net中,都希望有一個管理介面可以動態新增job,而避免每次都要上線釋出。 

也看到有園子的同學問過。這裡就介紹下實現動態新增job的幾種方式, 也是二次開發的核心模組。

閱讀目錄:

  1. 傳統方式
  2. 框架反射方式
  3. 程式方式
  4. URL方式
  5. 框架配置方式

傳統方式

 繼承IJob,實現業務邏輯,新增到scheduler。

public class MonitorJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            //do something
            Console.WriteLine("test");
        }
    }
 //var job = JobBuilder.Create<MonitorJob>()
            //    .WithIdentity("test", "value")
            //    .Build();
            //var trigger = (ICronTrigger) TriggerBuilder.Create()
            //    .WithIdentity("test", "value")
            //    .WithCronSchedule("0 0/5 * * * ?")
            //    .Build();
            //scheduler.ScheduleJob(job, trigger);

也可以使用CrystalQuartz遠端管理暫停取消。之前的部落格CrystalQuartz遠端管理(二)

框架反射方式

這種方式需要定義一套介面框架。 比如:

  interface IcustomJob
    {
        void Excute(string context);
        void Failed(string error);
        void Complete(string msg);
    }

1:當我們寫job時同一實現這個框架介面,類庫形式。

2:寫完後編譯成DLL,上傳到我們的作業執行節點。

3:在執行節點中,通過反射拿到DLL的job資訊。

4:然後構建quartz的job,新增到scheduler。

這種方式缺點: 耦合性太高,開發量較大。 優點:集中式管理。

系統結構如圖:

程式方式

這個方式和windows任務計劃類似。

1:使用方編寫自己的job,無需實現任何介面,可執行應用程式形式。

2:將程式傳送到執行節點,由執行節點起程式呼叫job程式。

執行節點呼叫,示例如下:

 public class ConsoleJob:IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string content = dataMap.GetString("jobData");
            var jd = new JavaScriptSerializer().Deserialize<ConsoleJobData>(content);

            Process p = new Process();
            p.StartInfo.UseShellExecute = true;
            p.StartInfo.FileName = jd.Path;
            p.StartInfo.Arguments = jd.Parameters;   //空格分割
            p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
            p.Start();
        }
    }

這種方式相對來說: 耦合性中等,執行節點和job相互不關心,沒有依賴,開發量較小。

系統結構如圖:

URL方式

URL方式和第三種類似,不過呼叫的不在是執行程式,而是URL。

1: 使用方在網頁或服務中,實現業務邏輯。

2: 然後將Url,交給執行節點post或get執行。

執行節點呼叫,示例如下:

 public class HttpJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            var dataMap = context.JobDetail.JobDataMap;

            var content = dataMap.GetString("jobData");

            var jd = new JavaScriptSerializer().Deserialize<HttpJobData>(content);

            if (jd.Parameters == null)
                jd.Parameters = string.Empty;
            if (jd.Timeout == 0)
                jd.Timeout = 5*60;

            var result = RequestHelper.Post(jd.Url, jd.ContentType, jd.Timeout, jd.Parameters, jd.heads);
        }
    }

這種方式耦合比較低,使用方不需要單獨寫應用程式了,和平常業務開發一樣。

執行節點的職權,僅僅作為一個觸發器。

有2點需要注意的是:

1:請求URL時,注意雙方約定token加密,防止非執行節點執行呼叫。

2:使用方,如果有耗時操作,建議非同步執行。 

系統結構如圖:

框架配置方式

1:使用方直接使用quartz.net框架,實現自己的job。從管理方拉取執行節點配置,然後自行管理執行節點。

2:使用方也可以暴露埠給管理方,以實現監控,修改配置。

這種形式,耦合性最低。是把管理方當成一個配置中心。     ps:幾乎和傳統方式+CrystalQuartz一樣了。

 

通過context.JobDetail.JobDataMap,可以儲存job的需要的資訊。

本篇介紹主流的幾種實現方案,供大家參考使用。

相關文章