/// <summary> /// 调度任务 /// </summary> /// <typeparam name="T">任务类型</typeparam> /// <param name="delay">延迟时间(毫秒)</param> /// <remarks>适用于没有参数,只有策略的任务</remarks> public static void Schedule <T>(int delay = 1000) where T : class, ICrontab { //调度任务 Type crontabType = typeof(T); #region # 验证 if (!CrontabSetting.CrontabStrategies.ContainsKey(crontabType.Name)) { throw new InvalidOperationException($"没有为定时任务\"{crontabType.Name}\"配置执行策略"); } #endregion ExecutionStrategy executionStrategy = CrontabSetting.CrontabStrategies[crontabType.Name]; ICrontab crontab = CrontabFactory.CreateCrontab(crontabType, executionStrategy); IEnumerable <ICrontabExecutor> crontabExecutors = CrontabExecutorFactory.GetCrontabExecutorsFor(crontabType); foreach (ICrontabExecutor crontabExecutor in crontabExecutors) { JobKey jobKey = new JobKey(crontab.Id); if (!_Scheduler.CheckExists(jobKey).Result) { Type jobType = crontabExecutor.GetType(); JobBuilder jobBuilder = JobBuilder.Create(jobType); //设置任务数据 IDictionary <string, object> dictionary = new Dictionary <string, object>(); dictionary.Add(crontab.Id, crontab); jobBuilder.SetJobData(new JobDataMap(dictionary)); //创建任务明细 IJobDetail jobDetail = jobBuilder.WithIdentity(jobKey).Build(); //创建触发器 ITrigger trigger = GetTrigger(crontab.ExecutionStrategy); //为调度者添加任务明细与触发器 _Scheduler.ScheduleJob(jobDetail, trigger).Wait(); //开始调度 _Scheduler.StartDelayed(TimeSpan.FromMilliseconds(delay)).Wait(); } else { _Scheduler.ResumeJob(jobKey).Wait(); } } //保存任务 using (ICrontabStore crontabStore = ResolveMediator.ResolveOptional <ICrontabStore>()) { crontab.Status = CrontabStatus.Scheduled; crontabStore?.Store(crontab); } }
//Public #region # 保存任务 —— static void Store(ICrontab crontab) /// <summary> /// 保存任务 /// </summary> /// <param name="crontab">定时任务</param> public static void Store(ICrontab crontab) { using (ICrontabStore crontabStore = ResolveMediator.ResolveOptional <ICrontabStore>()) { if (crontabStore == null) { throw new NotImplementedException("未注册持久化存储提供者!"); } crontabStore.Store(crontab); } }
/// <summary> /// 调度任务 /// </summary> /// <param name="crontab">定时任务</param> public static void Schedule(ICrontab crontab) { #region # 验证 if (crontab.ExecutionStrategy == null) { throw new InvalidOperationException("执行策略不可为空!"); } #endregion //调度任务 Type crontabType = crontab.GetType(); IEnumerable <ICrontabExecutor> crontabSchedulers = CrontabExecutorFactory.GetCrontabExecutorsFor(crontabType); foreach (ICrontabExecutor scheduler in crontabSchedulers) { JobKey jobKey = new JobKey(crontab.Id); if (!_Scheduler.CheckExists(jobKey).Result) { Type jobType = scheduler.GetType(); JobBuilder jobBuilder = JobBuilder.Create(jobType); //设置任务数据 IDictionary <string, object> dictionary = new Dictionary <string, object>(); dictionary.Add(crontab.Id, crontab); jobBuilder.SetJobData(new JobDataMap(dictionary)); //创建任务明细 IJobDetail jobDetail = jobBuilder.WithIdentity(jobKey).Build(); //创建触发器 ITrigger trigger = GetTrigger(crontab.ExecutionStrategy); //为调度者添加任务明细与触发器 _Scheduler.ScheduleJob(jobDetail, trigger).Wait(); //开始调度 _Scheduler.Start().Wait(); } else { _Scheduler.ResumeJob(jobKey).Wait(); } } //保存任务 using (ICrontabStore crontabStore = ResolveMediator.ResolveOptional <ICrontabStore>()) { crontab.Status = CrontabStatus.Scheduled; crontabStore?.Store(crontab); } }
/// <summary> /// 恢复任务 /// </summary> /// <param name="crontabId">定时任务Id</param> public static void Resume(string crontabId) { JobKey jobKey = new JobKey(crontabId); if (_Scheduler.CheckExists(jobKey).Result) { _Scheduler.ResumeJob(jobKey).Wait(); } else { using (ICrontabStore crontabStore = ResolveMediator.ResolveOptional <ICrontabStore>()) { if (crontabStore != null) { ICrontab crontab = crontabStore.Get <ICrontab>(crontabId); if (crontab != null) { Schedule(crontab); } else { throw new NullReferenceException($"Id为\"{crontabId}\"的任务不存在!"); } } } } //保存任务 using (ICrontabStore crontabStore = ResolveMediator.ResolveOptional <ICrontabStore>()) { if (crontabStore != null) { ICrontab crontab = crontabStore.Get <ICrontab>(crontabId); crontab.Status = CrontabStatus.Scheduled; crontabStore.Store(crontab); } } }