介紹
在實際專案使用中quartz.net中,都希望有一個管理介面可以動態新增job,而避免每次都要上線釋出。
也看到有園子的同學問過。這裡就介紹下實現動態新增job的幾種方式, 也是二次開發的核心模組。
閱讀目錄:
傳統方式
繼承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的需要的資訊。
本篇介紹主流的幾種實現方案,供大家參考使用。