標籤:
一:業務需求:
項目需要在不同時刻,執行一個或很多個不同的作業。
Windows執行計畫這時並不能很好的滿足需求了,迫切需要一個更為強大,方便管理,叢集部署的作業調度架構。
二:介紹
Quartz一個開源的作業調度架構,OpenSymphony的開源項目。Quartz.Net 是Quartz的C#移植版本。
特性:
1:支援叢集,作業分組,作業遠端管理。
2:自訂精細的時間觸發器,使用簡單,作業和觸發分離。
3:資料庫支援,可以寄宿Windows服務,WebSite,winform等。
三:使用的方法:
1.名詞的解釋:
Scheduler 作業調度器。
IJob 作業介面,繼承並實現Execute, 編寫執行的具體作業邏輯。
JobBuilder 根據設定,產生一個詳細作業資訊(JobDetail)。
TriggerBuilder 根據規則,生產對應的Trigger
2.學習的官網
Quartz.Net官方2.X教程 http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html
Quartz.Net開源地址 https://github.com/quartznet/quartznet
3.Nuget安裝
PM> Install-Package Quartz
4.代碼解釋:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using Quartz;using Quartz.Impl;using System.Collections.Specialized;namespace Portal.JobScheduler{ public class QuartzManager<T> where T:class,IJob { //發送器的工廠的介面中 執行個體一個具體的調度方法 private static ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); //JOb群組名 private static string JOB_GROUP_NAME = "JOBGROUP_NAME"; //觸發器群 private static string TRIGGER_GROUP_NAME = "TRIGGERGROUP_NAME"; /// <summary> /// 添加一個定時任務,使用預設的工作群組名,觸發器名,觸發器組名 /// </summary> /// <param name="pStrJobName">任務名</param> /// <param name="pStrCronExpress">觸發器運算式</param> public static void AddJob(string pStrJobName, string pStrCronExpress) { try { //介面中擷取調度工廠的 GetScheduler() 方法 IScheduler sched = schedulerFactory.GetScheduler(); //建立任務 IJobDetail job = JobBuilder.Create<T>().WithIdentity(pStrJobName, JOB_GROUP_NAME).Build(); //建立觸發器 ITrigger trigger = TriggerBuilder.Create() .WithIdentity(pStrJobName, TRIGGER_GROUP_NAME) .WithCronSchedule(pStrCronExpress) .Build(); sched.ScheduleJob(job, trigger); sched.Start(); } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 移除一個任務(使用預設的工作群組名,觸發器名,觸發器組名) /// </summary> /// <param name="pStrJobName"></param> public static void RemoveJob(string pStrJobName) { try { IScheduler sched = schedulerFactory.GetScheduler(); JobKey jobkey = new JobKey(pStrJobName); TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME); //停止觸發器 sched.PauseTrigger(triggerKey); //移除觸發器 sched.UnscheduleJob(triggerKey); //刪除任務 sched.DeleteJob(jobkey); } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 修改一個任務的觸發時間(使用預設的工作群組名,觸發器名,觸發器組名) /// </summary> /// <param name="pStrJobName">任務名</param> /// <param name="pStrCronExpress">觸發器運算式</param> public static void ModifyJobTime(string pStrJobName, string pStrCronExpress, IDictionary<string, object> pDictionary) { try { IScheduler sched = schedulerFactory.GetScheduler(); TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME); ICronTrigger trigger = (ICronTrigger)sched.GetTrigger(triggerKey); if (trigger == null) { return; } RemoveJob(pStrJobName); AddJob(pStrJobName, pStrCronExpress); } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 開啟所有定時任務 /// </summary> public static void startJobs() { try { IScheduler sched = schedulerFactory.GetScheduler(); sched.Start(); } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 關閉所有的定時任務 /// </summary> public static void shutdownJobs() { try { IScheduler sched = schedulerFactory.GetScheduler(); if (!sched.IsShutdown) { sched.Shutdown(); } } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 恢複所有的任務 /// </summary> public static void ResumeAllJobs() { try { IScheduler sched = schedulerFactory.GetScheduler(); if (!sched.IsShutdown) { sched.ResumeAll(); } } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 暫停所有的作業 /// </summary> public static void PauseAllJobs() { try { IScheduler sched = schedulerFactory.GetScheduler(); sched.PauseAll(); } catch (Exception e) { throw new Exception(e.Message); } } }}
Asp。net調用:
在global檔案中進行配置
private void RegisterJob() { QuartzManager<SHiddenDangerCaution>.AddJob("SHiddenDangerCautionInfo", "0 0 08 ? * *"); }
調度類的寫法:
public class SyncWeatherInfoJob:IJob { public void Execute(IJobExecutionContext context) { UpdateWeatherForecast(); } /// <summary> /// 更新氣象實況資訊 /// </summary> public void UpdateWeatherForecast() { WeatherForecast.InsertWeatherInfo(); --這裡的代碼就不貼出來 } }
這樣就完成了調度任務
CrystalQuartz 遠端管理
CrystalQuartz開源的地址 https://github.com/guryanovev/CrystalQuartz
但如果想方便的知道某個作業執行情況,需要暫停,啟動等操作行為,這時候就需要個Job管理的介面。
接下來介紹Quartz.NET如何進行遠程job管理,:
代碼:
一:作業服務端
static void Main(string[] args) { var properties = new NameValueCollection(); properties["quartz.scheduler.instanceName"] = "RemoteServerSchedulerClient"; // 設定線程池 properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; properties["quartz.threadPool.threadCount"] = "5"; properties["quartz.threadPool.threadPriority"] = "Normal"; // 遠程輸出配置 properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz"; properties["quartz.scheduler.exporter.port"] = "556"; properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler"; properties["quartz.scheduler.exporter.channelType"] = "tcp"; var schedulerFactory = new StdSchedulerFactory(properties); var scheduler = schedulerFactory.GetScheduler(); var job = JobBuilder.Create<PrintMessageJob>() .WithIdentity("myJob", "group1") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("myJobTrigger", "group1") .StartNow() .WithCronSchedule("/10 * * ? * *") .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); }public class PrintMessageJob : IJob { public void Execute(IJobExecutionContext context) { Console.WriteLine("Hello!"); } }
二:作業遠端管理端,無需寫任何代碼,引用官方程式集,嵌入到已有的web網站。
PM> Install-Package CrystalQuartz.Remote
Webconfig 需要配置的地方
<configuration> <crystalQuartz> <provider> <add property="Type" value="CrystalQuartz.Core.SchedulerProviders.RemoteSchedulerProvider, CrystalQuartz.Core" /> <add property="SchedulerHost" value="tcp://127.0.0.1:556/QuartzScheduler" /> <!--TCP監聽的地址--> </provider> </crystalQuartz><system.webServer> <!-- Handler攔截處理了,輸出作業監控頁面--> <handlers> <add name="CrystalQuartzPanel" verb="*" path="CrystalQuartzPanel.axd" type="CrystalQuartz.Web.PagesHandler, CrystalQuartz.Web" /> </handlers> </system.webServer></configuration>
Net作業調度-----Quartz.Net