介紹
在實際項目使用中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的需要的信息。
本篇介紹主流的幾種實現方案,供大家參考使用。