Net做業調度(五)—quartz.net動態添加job設計

介紹

在實際項目使用中quartz.net中,都但願有一個管理界面能夠動態添加job,而避免每次都要上線發佈。 html

也看到有園子的同窗問過。這裏就介紹下實現動態添加job的幾種方式, 也是二次開發的核心模塊。windows

閱讀目錄:

  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遠程管理(二)異步

框架反射方式

這種方式須要定義一套接口框架。 好比:post

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

1:當咱們寫job時同一實現這個框架接口,類庫形式。ui

2:寫完後編譯成DLL,上傳到咱們的做業執行節點。加密

3:在執行節點中,經過反射拿到DLL的job信息。spa

4:而後構建quartz的job,添加到scheduler。.net

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

系統結構如圖:

進程方式

這個方式和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的須要的信息。

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

相關文章
相關標籤/搜索