using System; using System.Collections.Generic; using log4net; using Quartz; using Quartz.Impl; using Quartz.Impl.Matchers; namespace ShwasherSys.QuartzHelpers { public class QuartzHelper { public static QuartzHelper Instance { get; set; } = new QuartzHelper(); #region Field Properties private readonly ILog _log = LogManager.GetLogger(typeof(QuartzHelper)); public ISchedulerFactory SchedulerFactory { get; set; } public IScheduler Sched { get; set; } public string JobName { get; set; } public string JobGroupName { get; set; } public string TriggerName { get; set; } public string TriggerGroupName { get; set; } public IJobDetail JobDetail { get; set; } public ITrigger Trigger { get; set; } DateTimeOffset? TimeOffset { get; set; } public string ErrorMsg { get; set; } //public ICronTrigger CronTrigger { get; set; } //public ISimpleTrigger SimpleTrigger { get; set; } #endregion #region Initialize private IScheduler GetScheduler() { IScheduler scheduler = null; try { scheduler = SchedulerFactory.GetScheduler().Result; } catch (SchedulerException e) { LogManager.GetLogger(typeof(QuartzHelper)).Info(e.Message); } return scheduler; } public QuartzHelper() { SchedulerFactory = new StdSchedulerFactory(); Sched = GetScheduler(); } public QuartzHelper(string jobName, string jobGroupName) : this() { TriggerName = JobName = jobName; JobGroupName = JobGroupName = jobGroupName; } public QuartzHelper(string jobName, string jobGroupName, string triggerName, string triggerGroupName) : this(jobName, jobGroupName) { TriggerName = triggerName; JobGroupName = triggerGroupName; } public QuartzHelper(string jobName, string jobGroupName, IJobDetail jobDetail, ITrigger trigger) : this(jobName, jobGroupName) { JobDetail = jobDetail; Trigger = trigger; } public QuartzHelper(IJobDetail jobDetail, ITrigger trigger) { SchedulerFactory = new StdSchedulerFactory(); Sched = SchedulerFactory.GetScheduler().Result; JobDetail = jobDetail; Trigger = trigger; } #endregion #region Create JobDetail /// /// 向Scheduler(调度程序)中添加Job /// /// public bool CreateJob() { if (JobDetail != null && Trigger != null) { if (Sched.IsShutdown) { SchedulerFactory = new StdSchedulerFactory(); Sched = SchedulerFactory.GetScheduler().Result; } if (CheckJobIsExist(JobDetail)) ErrorMsg = "JobtType:" + JobDetail.Key + " 已存在!"; TimeOffset = Sched.ScheduleJob(JobDetail, Trigger).Result; _log.Info("[" + JobDetail.Key + "] will run at: " + TimeOffset + "---->"); return true; } return false; } /// /// 向Scheduler(调度程序)中添加Job /// /// /// /// public bool CreateJob(IJobDetail jobDetail, ITrigger trigger) { ErrorMsg = ""; if (jobDetail != null && trigger != null) { if (Sched.IsShutdown) { SchedulerFactory = new StdSchedulerFactory(); Sched = SchedulerFactory.GetScheduler().Result; } if (CheckJobIsExist(jobDetail)) ErrorMsg = "JobtType:[" + jobDetail.Key + "] Is Exist!"; else { try { TimeOffset = Sched.ScheduleJob(jobDetail, trigger).Result; _log.Info("JobtType:[" + jobDetail.Key + "] will run at: " + TimeOffset + "---->"); return true; } catch (Exception e) { _log.Error(e.Message); ErrorMsg = "System Error!"; } } } else { ErrorMsg = "JobDetail/Trigger is null"; } return false; } /// /// 向Scheduler(调度程序)中添加Job /// /// /// /// /// /// public bool CreateJob(Type jobType, ITrigger trigger, string jobName = null, string jobGroupName = null) { IJobDetail jobDetail = GetJobDetail(jobType, jobName, jobGroupName); if (jobDetail == null) return false; return CreateJob(jobDetail, trigger); } /// /// 向Scheduler(调度程序)中添加Job /// /// /// /// 触发器参数:【"开始时间"|"开始时间单位(参照IntervalUnit)"|"间隔时间"|"间隔时间单位(参照IntervalUnit)"|"重复次数(0代表无限循环)"】 /// 【"cronExpStr"】(特定时间执行,填*代表每年每月...,填具体值代表特定值(多个值,间隔、范围值用-,a/b 指 从a开始,每隔b 触发一次)) /// /// 触发器类型 /// /// /// public bool CreateJob(Type jobType, string triggerStr, TriggerType triggerType = TriggerType.SimpleTrigger, string jobName = null, string jobGroupName = null) { IJobDetail jobDetail = GetJobDetail(jobType, jobName, jobGroupName); if (jobDetail == null) return false; ITrigger trigger; switch (triggerType) { #region SimpleTrigger case TriggerType.SimpleTrigger: if (GetSimpleTrigger(triggerStr, out trigger)) return CreateJob(jobDetail, trigger); break; #endregion #region CronTrigger case TriggerType.CronTrigger: string cronExpStr = triggerStr; //if (!string.IsNullOrEmpty(triggerArr[0])) // cronExpStr = GetCronExpString(triggerArr[0]); //else if (triggerArr.Length == 2) // cronExpStr = triggerArr[1]; if (GetCronTrigger(cronExpStr, out trigger)) return CreateJob(jobDetail, trigger); break; #endregion } return false; } /// /// 向Scheduler(调度程序)中添加Job /// /// /// CronSchedule 触发器表达式 /// /// /// public bool CreateJob(Type jobType, string cronExpStr, string jobName = null, string jobGroupName = null) { IJobDetail jobDetail = GetJobDetail(jobType, jobName, jobGroupName); if (jobDetail == null) return false; ITrigger trigger; if (GetCronTrigger(cronExpStr, out trigger)) return CreateJob(jobDetail, trigger); return false; } /// /// 向Scheduler(调度程序)中添加多个job任务 /// /// /// public void CreateJobs(IReadOnlyDictionary> triggersAndJobs, bool replace) { Sched.ScheduleJobs(triggersAndJobs, replace); } /// /// 添加 JobDetail /// /// /// 是否覆盖 public void AddJob(IJobDetail jobdetail, bool replace) { Sched.AddJob(jobdetail, replace); } #endregion #region Get JobDetail /// /// 获取 JobDetail /// /// /// public IJobDetail GetJobDetail(JobKey key) { return CheckJobIsExist(key) ? Sched.GetJobDetail(key).Result : null; } /// /// 获取 JobDetail /// /// /// /// public IJobDetail GetJobDetail(string jobName, string jobGroupName) { JobKey key = GetJobKey(jobName, jobGroupName); return GetJobDetail(key); } /// /// 构造 JobDetail /// /// /// /// /// public IJobDetail GetJobDetail(Type jobType, string jobName = null, string jobGroupName = null) { jobName = jobName ?? JobName; jobGroupName = jobGroupName ?? JobGroupName; if (string.IsNullOrEmpty(jobName) || string.IsNullOrEmpty(jobGroupName)) { ErrorMsg = "jobName/jobGroupName is empty!"; return null; } IJobDetail jobDetail = null; try { jobDetail = new JobDetailImpl(jobName, jobGroupName, jobType); } catch (Exception e) { _log.Error(e.Message); ErrorMsg = e.Message; } return jobDetail; } /// /// 获取job 组名 /// /// public IReadOnlyCollection GetJobGroupNames() { return Sched.GetJobGroupNames().Result; } /// /// 给JobDetail设置参数 /// /// /// 参数的值 /// 参数的键 public void SetJobDetailParm(IJobDetail jobDetail, Dictionary parmDic, string parmKey = "jobParm") { var map = jobDetail.JobDataMap.Get(parmKey); if (map != null) { jobDetail.JobDataMap[parmKey] = parmDic; } else { jobDetail.JobDataMap.Put(parmKey, parmDic); } } #endregion #region Delete JobDetail public bool DeleteJob(string jobName = null, string jobGroupName = null) { jobName = jobName ?? JobName; jobGroupName = jobGroupName ?? JobGroupName; return DeleteJob(GetJobKey(jobName, jobGroupName)); } public bool DeleteJob(IJobDetail jobDetail) { return jobDetail != null && Sched.DeleteJob(jobDetail.Key).Result; } public bool DeleteJob(JobKey key) { return Sched.DeleteJob(key).Result; } public bool DeleteJobs(string jobGroupName = null) { jobGroupName = jobGroupName ?? JobGroupName; var keys = GetJobKeys(jobGroupName); return Sched.DeleteJobs(keys).Result; } public bool DeleteJobs(List keys) { return Sched.DeleteJobs(keys).Result; } /* * 首先从Scheduler.scheduleJob(JobDetail jobDetail, Trigger trigger) 调度job,实际上就是将job存储到RAM中的jobsByGroup,jobsByKey对应的Map中, 将trigger存储到triggers(List),triggersByKey,triggersByGroup对应的Map中,及timeTriggers的Treeset中。 * Scheduler.unscheduleJob(TriggerKey triggerKey) 就是将triggerKey从triggersByKey,triggersByGroup,triggers,timeTriggers中移除; * Scheduler.deleteJob(JobKey jobKey)除了从容器triggers中的TriggerWrapper的JobKey为jobKey的List,并unscheduleJob(TriggerKey triggerKey)列表 List中的所有TriggerWrapper,同时从jobsByKey,jobsByGroup的移除对应jobKey的相关信息 */ /// /// 停止调度Job任务 /// /// /// /// If the related job does not have any other triggers, and the job is /// not durable, then the job will also be deleted. public bool UnscheduleJob(TriggerKey triggerkey) { return Sched.UnscheduleJob(triggerkey).Result; } /// /// 停止多个调度Job任务 /// /// /// public bool UnscheduleJobs(List triggerkeys) { return Sched.UnscheduleJobs(triggerkeys).Result; } /// /// 重新恢复触发器相关的job任务 /// /// /// /// public DateTimeOffset? RescheduleJob(TriggerKey triggerkey, ITrigger trigger) { return Sched.RescheduleJob(triggerkey, trigger).Result; } #endregion #region Get Trigger public ITrigger GetTrigger(TriggerKey key) { return CheckTriggerIsExist(key) ? Sched.GetTrigger(key).Result : null; } public ITrigger GetTrigger(string triggerName, string triggerGroupName) { var key = GetTriggerKey(triggerName, triggerGroupName); return GetTrigger(key); } /// /// 获取 指定 Job 里的所有 Trigger /// /// /// public IReadOnlyCollection GetTriggersByJob(JobKey key) { return CheckJobIsExist(key) ? Sched.GetTriggersOfJob(key).Result : null; } /// /// 获取 指定 TriggerGroup 里的所有 Trigger /// /// /// public IList GetTriggersByGroup(string triggerGroupName) { IList triggerList = new List(); var keys = GetTriggerKeys(triggerGroupName); foreach (var triggerKey in keys) { triggerList.Add(GetTrigger(triggerKey)); } return triggerList; } /// /// 获取所有的 Trigger /// /// public IList GetTriggers() { List triggerList = new List(); var triggerGroupNames = GetTriggerGroupNames(); foreach (var name in triggerGroupNames) { triggerList.AddRange(GetTriggersByGroup(name)); } return triggerList; } /// /// 获取暂停的 Trigger /// /// public IList GetPausedTriggers() { List triggerList = new List(); var triggerGroupNames = GetPausedTriggerGroupNames(); foreach (var name in triggerGroupNames) { triggerList.AddRange(GetTriggersByGroup(name)); } return triggerList; } /// /// 获取 所有的 TriggerGroupName /// /// public IReadOnlyCollection GetTriggerGroupNames() { return Sched.GetTriggerGroupNames().Result; } /// /// 获取 暂停的 TriggerGroupName /// /// public IReadOnlyCollection GetPausedTriggerGroupNames() { return Sched.GetPausedTriggerGroups().Result; } /// /// 获取 指定 Trigger 的 TriggerState /// /// /// public TriggerState GetTriggerState(TriggerKey key) { return CheckTriggerIsExist(key) ? Sched.GetTriggerState(key).Result : TriggerState.None; } /// /// 根据参数数组(1个|4个)创建SimpleTrigger /// /// /// /// /// /// public bool GetSimpleTrigger(string triggerStr, out ITrigger trigger, string triggerName = null, string triggerGroupName = null) { trigger = null; if (string.IsNullOrEmpty(triggerName)) triggerName = TriggerName; if (string.IsNullOrEmpty(triggerGroupName)) triggerGroupName = TriggerName; if (CheckTriggerIsExist(triggerName, triggerGroupName)) { ErrorMsg = "Trigger[" + triggerGroupName + "." + triggerName + "] Is Exist"; return false; } string[] triggerArr = triggerStr.Split('|'); #region Length = 1 if (triggerArr.Length == 1) { ErrorMsg = "参数 [1]TriggerArray 有误,不能解析。"; DateTimeOffset startTime; if (!DateTimeOffset.TryParse(triggerArr[0], out startTime)) return false; //int start, startUnit; //if (!int.TryParse(triggerArr[0], out start)) return false; //if (!int.TryParse(triggerArr[1], out startUnit)) return false; //DateTimeOffset startTime = DateBuilder.FutureDate(start, (IntervalUnit)startUnit); trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime).Build(); _log.InfoFormat("Trigger----{0}----{1}----", triggerArr[0], triggerArr[1]); ErrorMsg = ""; return true; } #endregion #region Length = 4 if (triggerArr.Length == 4) { ErrorMsg = "参数 [4]TriggerArray 有误,不能解析。"; DateTimeOffset startTime; int interval, intervalUnit, repeatCount; if (!DateTimeOffset.TryParse(triggerArr[0], out startTime)) return false; if (!int.TryParse(triggerArr[1], out interval)) return false; if (!int.TryParse(triggerArr[2], out intervalUnit)) return false; // = DateBuilder.FutureDate(future, (IntervalUnit)futureUnit); if (string.IsNullOrEmpty(triggerArr[3])) repeatCount = 0; else if (!int.TryParse(triggerArr[3], out repeatCount)) return false; switch (repeatCount) { case 0: switch (intervalUnit) { default: trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInSeconds(interval).RepeatForever()).Build(); break; case 1: trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInSeconds(interval).RepeatForever()).Build(); break; case 2: trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInMinutes(interval).RepeatForever()).Build(); break; case 3: trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInHours(interval).RepeatForever()).Build(); break; } break; default: repeatCount = repeatCount - 1; switch (intervalUnit) { default: trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInSeconds(interval).WithRepeatCount(repeatCount)).Build(); break; case 1: trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInSeconds(interval).WithRepeatCount(repeatCount)).Build(); break; case 2: trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInMinutes(interval).WithRepeatCount(repeatCount)).Build(); break; case 3: trigger = (ISimpleTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInHours(interval).WithRepeatCount(repeatCount)).Build(); break; } break; } _log.InfoFormat("Trigger----{0}----{1}----{2}----{3}----", triggerArr[0], triggerArr[1], triggerArr[2], triggerArr[3]); ErrorMsg = ""; return true; } #endregion ErrorMsg = "参数 TriggerArray 有误,不能解析。"; return false; } /// /// 根据表达式创建CronTrigger /// /// /// /// /// /// public bool GetCronTrigger(string cronExpStr, out ITrigger trigger, string triggerName = null, string triggerGroupName = null) { trigger = null; if (string.IsNullOrEmpty(triggerName)) triggerName = TriggerName; if (string.IsNullOrEmpty(triggerGroupName)) triggerGroupName = TriggerName; if (CheckTriggerIsExist(triggerName, triggerGroupName)) { ErrorMsg = "Trigger[" + triggerGroupName + "." + triggerName + "] Is Exist"; return false; } try { trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity(triggerName, triggerGroupName).WithCronSchedule(cronExpStr).Build(); return true; } catch (Exception e) { _log.Error(e.Message); ErrorMsg = e.Message; } return false; } /// /// 根据参数 创建 Cron表达式 /// /// ["*y*M*d*H*m*s"] /// public string GetCronExpString(string triggerStr) { try { int s = triggerStr.IndexOf("s", StringComparison.Ordinal); int e = triggerStr.IndexOf("m", StringComparison.Ordinal) + 1; string sec = ConvertSpaceStr(triggerStr.Substring(e, s - e)); s = e - 1; e = triggerStr.IndexOf("H", StringComparison.Ordinal) + 1; string min = ConvertSpaceStr(triggerStr.Substring(e, s - e)); s = e - 1; e = triggerStr.IndexOf("d", StringComparison.Ordinal) + 1; string hour = ConvertSpaceStr(triggerStr.Substring(e, s - e)); s = e - 1; e = triggerStr.IndexOf("M", StringComparison.Ordinal) + 1; string day = ConvertSpaceStr(triggerStr.Substring(e, s - e)); s = e - 1; e = triggerStr.IndexOf("y", StringComparison.Ordinal) + 1; string month = ConvertSpaceStr(triggerStr.Substring(e, s - e)); s = e - 1; e = 0; string year = ConvertSpaceStr(triggerStr.Substring(e, s - e)); var ss = sec + " " + min + " " + hour + " " + day + " " + month + " ? " + year + ""; return ss; } catch (Exception exception) { _log.Error(exception); } return ""; /*****cron表达式说明 * 六个或七个单元 * 秒 分 时 月中天 月份 月中星期几 (年) * 秒,分,时,天 * 字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年(可选) 留空, 1970-2099 , - * / ----> 符号说明 *:表示任意时刻 ?:只能在日或周字段上使用,简单的理解就是日期和星期是有冲突的,指定其中一个的话,另外一个是没办法指定的,比如每个月12号和每个星期二,这两个是"互斥"的,不能用日期和周来指定所有“每个是星期二的12号”这个时间。 -:范围,如 1-5秒 ,:列表,如 1,5,10 秒 /:等步长序列,如3/13秒 表示 3,16,29,42,55,3,16... L:仅在日和周上支持,表示允许的最后一个值,注意不要让范围和列表与L连用 W:工作日 #:为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。 *****/ //秒 分 时 月中天 月份 月中星期几 (年) } /// /// 根据参数 创建 Cron表达式 /// /// /// public string GetCronExpString(string[] triggerArr) { if (triggerArr.Length != 6) return ""; return ConvertSpaceStr(triggerArr[5]) + " " + ConvertSpaceStr(triggerArr[4]) + " " + ConvertSpaceStr(triggerArr[3]) + " " + ConvertSpaceStr(triggerArr[2]) + " " + ConvertSpaceStr(triggerArr[1]) + " ? " + ConvertSpaceStr(triggerArr[0]) + ""; } /// /// 空字符串转换 /// /// /// private string ConvertSpaceStr(string triggerStr) { return string.IsNullOrEmpty(triggerStr) ? "0" : triggerStr; } /// /// 获取下次运行时间。 /// /// /// public string GetNextDate(ITrigger trigger) { var nextFireTime = trigger.GetNextFireTimeUtc(); DateTime nextTime; string nextTimeStr = ""; if (DateTime.TryParse(nextFireTime.ToString(), out nextTime)) nextTimeStr = nextTime.ToString("yyyy-MM-dd HH:mm:ss"); return nextTimeStr; } #endregion #region Pasued / Resume /// /// 暂停 Job /// /// /// public bool PausedJob(JobKey key) { if (!CheckJobIsExist(key)) { ErrorMsg = key + " is not find!"; return false; } Sched.PauseJob(key); return true; } /// /// 恢复 Job /// /// /// public bool ResumeJob(JobKey key) { if (!CheckJobIsExist(key)) { ErrorMsg = key + " is not find!"; return false; } Sched.PauseJob(key); return true; } /// /// 暂停 Job /// /// /// public bool PausedJob(IJobDetail jobDetail) { return PausedJob(jobDetail.Key); } /// /// 恢复 Job /// /// /// public bool ResumeJob(IJobDetail jobDetail) { return ResumeJob(jobDetail.Key); } /// /// 暂停 Job组 /// /// public void PausedJobs(string jobGroupName) { Sched.PauseJobs(GroupMatcher.GroupEquals(jobGroupName)); } /// /// 恢复 Job组 /// /// public void ResumeJobs(string jobGroupName) { Sched.PauseJobs(GroupMatcher.GroupEquals(jobGroupName)); } /// /// 暂停 Trigger /// /// /// public bool PausedTrigger(TriggerKey key) { if (!CheckTriggerIsExist(key)) { ErrorMsg = key + " is not find!"; return false; } Sched.PauseTrigger(key); return true; } /// /// 恢复 Trigger /// /// /// public bool ResumeTrigger(TriggerKey key) { if (!CheckTriggerIsExist(key)) { ErrorMsg = key + " is not find!"; return false; } Sched.PauseTrigger(key); return true; } /// /// 暂停 Trigger /// /// /// public bool PausedTrigger(ITrigger trigger) { return PausedTrigger(trigger.Key); } /// /// 恢复 Trigger /// /// /// public bool ResumeTrigger(ITrigger trigger) { return ResumeTrigger(trigger.Key); } /// /// 暂停 Trigger组 /// /// public void PausedTriggers(string triggerGroupName) { Sched.PauseTriggers(GroupMatcher.GroupEquals(triggerGroupName)); } /// /// 恢复 Trigger组 /// /// public void ResumeTriggers(string triggerGroupName) { Sched.PauseTriggers(GroupMatcher.GroupEquals(triggerGroupName)); } /// /// 暂停调度中所有的job任务 /// public void PausedAll() { Sched.PauseAll(); } /// /// 恢复调度中所有的job任务 /// public void ResumeAll() { Sched.PauseAll(); } #endregion #region Get Key /// /// 获取 Jobkey /// /// /// /// public JobKey GetJobKey(string jobName, string jobGroupName) { return JobKey.Create(jobName, jobGroupName); } /// /// 获取 JobKeys /// /// /// public IReadOnlyCollection GetJobKeys(string jobGroupName) { return Sched.GetJobKeys(GroupMatcher.GroupEquals(jobGroupName)).Result; } /// /// 获取 TriggerKey /// /// /// /// public TriggerKey GetTriggerKey(string triggerName, string triggerGroupName) { return new TriggerKey(triggerName, triggerGroupName); } /// /// 获取 TriggerKeys /// /// /// public IReadOnlyCollection GetTriggerKeys(string triggerGroupName) { return Sched.GetTriggerKeys(GroupMatcher.GroupEquals(triggerGroupName)).Result; } #endregion #region Check IsExist /// /// 检查调度是否启动 /// /// public bool CheckIsStarted() { return Sched.IsStarted; } /// /// 检查Job是否已存在 /// /// /// /// public bool CheckJobIsExist(string jobName, string jobGroupName) { JobKey key = new JobKey(jobName, jobGroupName); return CheckJobIsExist(key); } /// /// 检查Job是否已存在; /// /// /// public bool CheckJobIsExist(IJobDetail jobDetail) { return CheckJobIsExist(jobDetail.Key); } /// /// 检查Job是否已存在; /// /// /// public bool CheckJobIsExist(JobKey key) { return Sched.CheckExists(key).Result; } /// /// 检查Trigger是否已存在; /// /// /// /// public bool CheckTriggerIsExist(string triggerName, string triggerGroupName) { TriggerKey key = new TriggerKey(triggerName, triggerGroupName); return CheckTriggerIsExist(key); } /// /// 检查Trigger是否已存在; /// /// /// public bool CheckTriggerIsExist(ITrigger trigger) { return CheckJobIsExist(trigger.JobKey); } /// /// 检查Trigger是否已存在; /// /// /// public bool CheckTriggerIsExist(TriggerKey key) { return Sched.CheckExists(key).Result; } #endregion #region Start / Stop /// /// 启动调度信息 /// public void Start() { _log.Info("------- Starting ---------------------]"); Sched.Start(); _log.Info("------- Started ---------------------]"); } /// /// 关闭调度信息 /// public void Shutdown() { _log.Info("------- Shutting Down ---------------------"); Sched.Shutdown(true); _log.Info("------- Shutdown Complete -----------------"); } /// /// 启动 任务 /// /// public void TriggerJob(JobKey jobkey) { Sched.TriggerJob(jobkey); } /// /// 启动 任务 /// /// /// public void TriggerJob(JobKey jobkey, JobDataMap jobdatamap) { Sched.TriggerJob(jobkey, jobdatamap); } #endregion #region Reset Name /// /// 重置 jobName /// /// /// public void ResetJobName(string jobName = null, string jobGroupName = null) { if (!string.IsNullOrEmpty(jobName)) JobName = jobName; if (!string.IsNullOrEmpty(jobGroupName)) JobGroupName = jobGroupName; } /// /// 重置 TriggerName /// /// /// public void ResetTriggerName(string triggerName = null, string triggerGroupName = null) { if (!string.IsNullOrEmpty(triggerName)) TriggerName = triggerName; if (!string.IsNullOrEmpty(triggerGroupName)) TriggerGroupName = triggerGroupName; } #endregion } }