在實際項目使用中quartz.net中,都但願有一個管理界面能夠動態添加job,而避免每次都要上線發佈。 html
也看到有園子的同窗問過。這裏就介紹下實現動態添加job的幾種方式, 也是二次開發的核心模塊。windows
繼承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。
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的須要的信息。
本篇介紹主流的幾種實現方案,供你們參考使用。