本文來自:http://www.cnblogs.com/pengze0902/p/6128558.html
/// <summary> /// 任務處理幫助類 /// </summary> public class QuartzHelper { public QuartzHelper() { } public QuartzHelper(string quartzServer, string quartzPort) { Server = quartzServer; Port = quartzPort; } /// <summary> /// 鎖對象 /// </summary> private static readonly object Obj = new object(); /// <summary> /// 方案 /// </summary> private const string Scheme = "tcp"; /// <summary> /// 服務器的地址 /// </summary> public static string Server { get; set; } /// <summary> /// 服務器的端口 /// </summary> public static string Port { get; set; } /// <summary> /// 緩存任務所在程序集信息 /// </summary> private static readonly Dictionary<string, Assembly> AssemblyDict = new Dictionary<string, Assembly>(); /// <summary> /// 程序調度 /// </summary> private static IScheduler _scheduler; /// <summary> /// 初始化任務調度對象 /// </summary> public static void InitScheduler() { try { lock (Obj) { if (_scheduler != null) return; //配置文件的方式,配置quartz實例 ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); _scheduler = schedulerFactory.GetScheduler(); } } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 啓用任務調度 /// 啓動調度時會把任務表中狀態爲「執行中」的任務加入到任務調度隊列中 /// </summary> public static void StartScheduler() { try { if (_scheduler.IsStarted) return; //添加全局監聽 _scheduler.ListenerManager.AddTriggerListener(new CustomTriggerListener(), GroupMatcher<TriggerKey>.AnyGroup()); _scheduler.Start(); //獲取全部執行中的任務 List<TaskModel> listTask = TaskHelper.GetAllTaskList().ToList(); if (listTask.Count > 0) { foreach (TaskModel taskUtil in listTask) { try { ScheduleJob(taskUtil); } catch (Exception e) { throw new Exception(taskUtil.TaskName,e); } } } } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 啓用任務 /// <param name="task">任務信息</param> /// <param name="isDeleteOldTask">是否刪除原有任務</param> /// <returns>返回任務trigger</returns> /// </summary> public static void ScheduleJob(TaskModel task, bool isDeleteOldTask = false) { if (isDeleteOldTask) { //先刪除現有已存在任務 DeleteJob(task.TaskID.ToString()); } //驗證是否正確的Cron表達式 if (ValidExpression(task.CronExpressionString)) { IJobDetail job = new JobDetailImpl(task.TaskID.ToString(), GetClassInfo(task.AssemblyName, task.ClassName)); //添加任務執行參數 job.JobDataMap.Add("TaskParam", task.TaskParam); CronTriggerImpl trigger = new CronTriggerImpl { CronExpressionString = task.CronExpressionString, Name = task.TaskID.ToString(), Description = task.TaskName }; _scheduler.ScheduleJob(job, trigger); if (task.Status == TaskStatus.STOP) { JobKey jk = new JobKey(task.TaskID.ToString()); _scheduler.PauseJob(jk); } else { List<DateTime> list = GetNextFireTime(task.CronExpressionString, 5); foreach (var time in list) { LogHelper.WriteLog(time.ToString(CultureInfo.InvariantCulture)); } } } else { throw new Exception(task.CronExpressionString + "不是正確的Cron表達式,沒法啓動該任務!"); } } /// <summary> /// 初始化 遠程Quartz服務器中的,各個Scheduler實例。 /// 提供給遠程管理端的後臺,用戶獲取Scheduler實例的信息。 /// </summary> public static void InitRemoteScheduler() { try { NameValueCollection properties = new NameValueCollection { ["quartz.scheduler.instanceName"] = "ExampleQuartzScheduler", ["quartz.scheduler.proxy"] = "true", ["quartz.scheduler.proxy.address"] =string.Format("{0}://{1}:{2}/QuartzScheduler", Scheme, Server, Port) }; ISchedulerFactory sf = new StdSchedulerFactory(properties); _scheduler = sf.GetScheduler(); } catch (Exception ex) { throw new Exception(ex.StackTrace); } } /// <summary> /// 刪除現有任務 /// </summary> /// <param name="jobKey"></param> public static void DeleteJob(string jobKey) { try { JobKey jk = new JobKey(jobKey); if (_scheduler.CheckExists(jk)) { //任務已經存在則刪除 _scheduler.DeleteJob(jk); } } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 暫停任務 /// </summary> /// <param name="jobKey"></param> public static void PauseJob(string jobKey) { try { JobKey jk = new JobKey(jobKey); if (_scheduler.CheckExists(jk)) { //任務已經存在則暫停任務 _scheduler.PauseJob(jk); } } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 恢復運行暫停的任務 /// </summary> /// <param name="jobKey">任務key</param> public static void ResumeJob(string jobKey) { try { JobKey jk = new JobKey(jobKey); if (_scheduler.CheckExists(jk)) { //任務已經存在則暫停任務 _scheduler.ResumeJob(jk); } } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 獲取類的屬性、方法 /// </summary> /// <param name="assemblyName">程序集</param> /// <param name="className">類名</param> private static Type GetClassInfo(string assemblyName, string className) { try { assemblyName = FileHelper.GetAbsolutePath(assemblyName + ".dll"); Assembly assembly = null; if (!AssemblyDict.TryGetValue(assemblyName, out assembly)) { assembly = Assembly.LoadFrom(assemblyName); AssemblyDict[assemblyName] = assembly; } Type type = assembly.GetType(className, true, true); return type; } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 中止任務調度 /// </summary> public static void StopSchedule() { try { //判斷調度是否已經關閉 if (!_scheduler.IsShutdown) { //等待任務運行完成 _scheduler.Shutdown(true); } } catch (Exception ex) { throw new Exception(ex.Message); } } /// <summary> /// 校驗字符串是否爲正確的Cron表達式 /// </summary> /// <param name="cronExpression">帶校驗表達式</param> /// <returns></returns> public static bool ValidExpression(string cronExpression) { return CronExpression.IsValidExpression(cronExpression); } /// <summary> /// 獲取任務在將來週期內哪些時間會運行 /// </summary> /// <param name="CronExpressionString">Cron表達式</param> /// <param name="numTimes">運行次數</param> /// <returns>運行時間段</returns> public static List<DateTime> GetNextFireTime(string CronExpressionString, int numTimes) { if (numTimes < 0) { throw new Exception("參數numTimes值大於等於0"); } //時間表達式 ITrigger trigger = TriggerBuilder.Create().WithCronSchedule(CronExpressionString).Build(); IList<DateTimeOffset> dates = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, numTimes); List<DateTime> list = new List<DateTime>(); foreach (DateTimeOffset dtf in dates) { list.Add(TimeZoneInfo.ConvertTimeFromUtc(dtf.DateTime, TimeZoneInfo.Local)); } return list; } public static object CurrentTaskList() { throw new NotImplementedException(); } /// <summary> /// 獲取當前執行的Task 對象 /// </summary> /// <param name="context"></param> /// <returns></returns> public static TaskModel GetTaskDetail(IJobExecutionContext context) { TaskModel task = new TaskModel(); if (context != null) { task.TaskID = Guid.Parse(context.Trigger.Key.Name); task.TaskName = context.Trigger.Description; task.RecentRunTime = DateTime.Now; task.TaskParam = context.JobDetail.JobDataMap.Get("TaskParam") != null ? context.JobDetail.JobDataMap.Get("TaskParam").ToString() : ""; } return task; } }