/// <summary> /// 创建SimpleTrigger触发器(简单触发器) /// </summary> /// <param name="sysSchedule"></param> /// <param name="starRunTime"></param> /// <param name="endRunTime"></param> /// <returns></returns> private ITrigger CreateSimpleTrigger(SysTaskQzEntity sysSchedule) { if (sysSchedule.RunTimes > 0) { ITrigger trigger = TriggerBuilder.Create() .WithIdentity(sysSchedule.Id.ToString(), sysSchedule.JobGroup) .StartAt(sysSchedule.BeginTime.Value) .EndAt(sysSchedule.EndTime.Value) .WithSimpleSchedule(x => x.WithIntervalInSeconds(sysSchedule.IntervalSecond) .WithRepeatCount(sysSchedule.RunTimes)).ForJob(sysSchedule.Id.ToString(), sysSchedule.JobGroup).Build(); return(trigger); } else { ITrigger trigger = TriggerBuilder.Create() .WithIdentity(sysSchedule.Id.ToString(), sysSchedule.JobGroup) .StartAt(sysSchedule.BeginTime.Value) .EndAt(sysSchedule.EndTime.Value) .WithSimpleSchedule(x => x.WithIntervalInSeconds(sysSchedule.IntervalSecond) .RepeatForever()).ForJob(sysSchedule.Id.ToString(), sysSchedule.JobGroup).Build(); return(trigger); } }
/// <summary> /// 停止任务 /// </summary> /// <param name="sysSchedule"></param> /// <returns></returns> public async Task <IResponseEntity> StopScheduleJobAsync(SysTaskQzEntity sysSchedule) { try { JobKey jobKey = new JobKey(sysSchedule.Id.ToString(), sysSchedule.JobGroup); if (!await _scheduler.Result.CheckExists(jobKey)) { await Console.Out.WriteLineAsync($"未找到要停止的任务:【{sysSchedule.Name}】"); return(ResponseEntity.Error($"未找到要停止的任务:【{sysSchedule.Name}】")); } else { await _scheduler.Result.DeleteJob(jobKey); await Console.Out.WriteLineAsync($"停止任务:【{sysSchedule.Name}】成功"); return(ResponseEntity.Ok($"停止任务:【{sysSchedule.Name}】成功")); } } catch (Exception) { throw; } }
/// <summary> /// 创建类型Cron的触发器 /// </summary> /// <param name="m"></param> /// <returns></returns> private ITrigger CreateCronTrigger(SysTaskQzEntity sysSchedule) { // 作业触发器 return(TriggerBuilder.Create() .WithIdentity(sysSchedule.Id.ToString(), sysSchedule.JobGroup) .StartAt(sysSchedule.BeginTime.Value) //开始时间 .EndAt(sysSchedule.EndTime.Value) //结束数据 .WithCronSchedule(sysSchedule.Cron) //指定cron表达式 .ForJob(sysSchedule.Id.ToString(), sysSchedule.JobGroup) //作业名称 .Build()); }
/// <summary> /// 恢复指定的计划任务 /// </summary> /// <param name="sysSchedule"></param> /// <returns></returns> public async Task <IResponseEntity> ResumeJob(SysTaskQzEntity sysSchedule) { try { JobKey jobKey = new JobKey(sysSchedule.Id.ToString(), sysSchedule.JobGroup); if (!await _scheduler.Result.CheckExists(jobKey)) { return(ResponseEntity.Error($"未找到要重新的任务:【{sysSchedule.Name}】,请先选择添加计划!")); } await this._scheduler.Result.ResumeJob(jobKey); return(ResponseEntity.Ok($"恢复计划任务:【{sysSchedule.Name}】成功")); } catch (Exception) { throw; } }
/// <summary> /// 更新计划任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> public async Task <int> UpdateTaskQz(SysTaskQzEntity entity) { return(await _SysTaskQzRepository.UpdateAsync(entity)); }
/// <summary> /// 添加一个计划任务(映射程序集指定IJob实现类) /// </summary> /// <param name="tasksQz"></param> /// <returns></returns> public async Task <IResponseEntity> AddScheduleJobAsync(SysTaskQzEntity tasksQz) { if (tasksQz == null) { await Console.Out.WriteLineAsync("计划任务不存在!"); return(ResponseEntity.Error("计划任务不存在!")); } try { JobKey jobKey = new JobKey(tasksQz.Id.ToString(), tasksQz.JobGroup); if (await _scheduler.Result.CheckExists(jobKey)) { await Console.Out.WriteLineAsync($"该任务计划已经在执行:【{tasksQz.Name}】,请勿重复启动!"); return(ResponseEntity.Error($"该任务计划已经在执行:【{tasksQz.Name}】,请勿重复启动!")); } #region 设置开始时间和结束时间 if (tasksQz.BeginTime == null) { tasksQz.BeginTime = DateTime.Now; } DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(tasksQz.BeginTime, 1);//设置开始时间 if (tasksQz.EndTime == null) { tasksQz.EndTime = DateTime.MaxValue.AddDays(-1); } DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(tasksQz.EndTime, 1);//设置暂停时间 #endregion #region 通过反射获取程序集类型和类 Assembly assembly = Assembly.Load(new AssemblyName(tasksQz.AssemblyName)); Type jobType = assembly.GetType(tasksQz.AssemblyName + ".Jobs." + tasksQz.ClassName); #endregion //传入反射出来的执行程序集 IJobDetail job = new JobDetailImpl(tasksQz.Id.ToString(), tasksQz.JobGroup, jobType); job.JobDataMap.Add("JobParams", tasksQz.JobParams); if (tasksQz.ConnectionParam.IsNull()) { await Console.Out.WriteLineAsync($"任务依赖数据库为空!"); return(ResponseEntity.Error($"任务依赖数据库为空!")); } job.JobDataMap.Add("ConnectionParam", tasksQz.ConnectionParam); ITrigger trigger; #region 泛型传递 //IJobDetail job1 = JobBuilder.Create<T>() // .WithIdentity(sysSchedule.Name, sysSchedule.JobGroup) // .Build(); #endregion if (tasksQz.Cron != null && CronExpression.IsValidExpression(tasksQz.Cron) && tasksQz.TriggerType > 0) { trigger = CreateCronTrigger(tasksQz); } else { trigger = CreateSimpleTrigger(tasksQz); } //判断任务调度是否开启 if (!_scheduler.Result.IsStarted) { await StartScheduleAsync(); } // 告诉Quartz使用我们的触发器来安排作业 await _scheduler.Result.ScheduleJob(job, trigger); await Console.Out.WriteLineAsync($"启动任务:【{tasksQz.Name}】成功"); return(ResponseEntity.Ok($"启动任务:【{tasksQz.Name}】成功")); } catch (Exception ex) { throw; } }