/// <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;
            }
        }
示例#5
0
 /// <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;
            }
        }