/// <summary> /// 创建类型Simple的触发器 /// </summary> /// <param name="entity"></param> /// <returns></returns> private ITrigger CreateSimpleTrigger(ScheduleEntity entity) { //作业触发器 if (entity.RunTimes.HasValue && entity.RunTimes > 0) { return(TriggerBuilder.Create() .WithIdentity(entity.JobName, entity.JobGroup) .StartAt(entity.BeginTime) //开始时间 .EndAt(entity.EndTime) //结束数据 .WithSimpleSchedule(x => { x.WithIntervalInSeconds(entity.IntervalSecond.Value) //执行时间间隔,单位秒 .WithRepeatCount(entity.RunTimes.Value) //执行次数、默认从0开始 .WithMisfireHandlingInstructionFireNow(); }) .ForJob(entity.JobName, entity.JobGroup)//作业名称 .Build()); } else { return(TriggerBuilder.Create() .WithIdentity(entity.JobName, entity.JobGroup) .StartAt(entity.BeginTime) //开始时间 .EndAt(entity.EndTime) //结束数据 .WithSimpleSchedule(x => { x.WithIntervalInSeconds(entity.IntervalSecond.Value) //执行时间间隔,单位秒 .RepeatForever() //无限循环 .WithMisfireHandlingInstructionFireNow(); }) .ForJob(entity.JobName, entity.JobGroup)//作业名称 .Build()); } }
/// <summary> /// 创建类型Simple的触发器 /// </summary> /// <param name="entity"></param> /// <returns></returns> private ITrigger CreateSimpleTrigger(ScheduleEntity entity) { //作业触发器 if (entity.RunTimes > 0) { return(TriggerBuilder.Create() .WithIdentity(entity.JobName, entity.JobGroup) .StartAt(entity.BeginTime) //开始时间 .EndAt(entity.EndTime) //结束数据 .WithSimpleSchedule(x => x .WithIntervalInSeconds(entity.IntervalSecond.Second) //执行时间间隔,单位秒 .WithRepeatCount(entity.RunTimes)) //执行次数、默认从0开始 .ForJob(entity.JobName, entity.JobGroup) //作业名称 .Build()); } else { return(TriggerBuilder.Create() .WithIdentity(entity.JobName, entity.JobGroup) .StartAt(entity.BeginTime) //开始时间 .EndAt(entity.EndTime) //结束数据 .WithSimpleSchedule(x => x .WithIntervalInSeconds(entity.IntervalSecond.Second) //执行时间间隔,单位秒 .RepeatForever()) //无限循环 .ForJob(entity.JobName, entity.JobGroup) //作业名称 .Build()); } }
/// <summary> /// 查询任务 /// </summary> /// <param name="jobGroup"></param> /// <param name="jobName"></param> /// <returns></returns> public async Task <ScheduleEntity> QueryJobAsync(string jobGroup, string jobName) { var entity = new ScheduleEntity(); var jobKey = new JobKey(jobName, jobGroup); var jobDetail = await scheduler.GetJobDetail(jobKey); var triggersList = await scheduler.GetTriggersOfJob(jobKey); var triggers = triggersList.AsEnumerable().FirstOrDefault(); var intervalSeconds = (triggers as SimpleTriggerImpl)?.RepeatInterval.TotalSeconds; entity.RequestUrl = jobDetail.JobDataMap.GetString(Constant.REQUESTURL); entity.BeginTime = triggers.StartTimeUtc.LocalDateTime; entity.EndTime = triggers.EndTimeUtc?.LocalDateTime; entity.IntervalSecond = intervalSeconds.HasValue ? Convert.ToInt32(intervalSeconds.Value) : 0; entity.JobGroup = jobGroup; entity.JobName = jobName; entity.Cron = (triggers as CronTriggerImpl)?.CronExpressionString; entity.RunTimes = (triggers as SimpleTriggerImpl)?.RepeatCount; entity.TriggerType = triggers is SimpleTriggerImpl ? TriggerTypeEnum.Simple : TriggerTypeEnum.Cron; entity.RequestType = (RequestTypeEnum)int.Parse(jobDetail.JobDataMap.GetString(Constant.REQUESTTYPE)); entity.RequestParameters = jobDetail.JobDataMap.GetString(Constant.REQUESTPARAMETERS); entity.Headers = jobDetail.JobDataMap.GetString(Constant.HEADERS); entity.MailMessage = (MailMessageEnum)int.Parse(jobDetail.JobDataMap.GetString(Constant.MAILMESSAGE) ?? "0"); entity.Description = jobDetail.Description; return(entity); }
/// <summary> /// 创建类型Cron的触发器 /// </summary> /// <param name="entity"></param> /// <returns></returns> private ITrigger CreateCronTrigger(ScheduleEntity entity) { // 作业触发器 return(TriggerBuilder.Create() .WithIdentity(entity.JobName, entity.JobGroup) .StartAt(entity.BeginTime) //开始时间 .EndAt(entity.EndTime) //结束时间 .WithCronSchedule(entity.Cron) //指定cron表达式 .ForJob(entity.JobName, entity.JobGroup) //作业名称 .Build()); }
/// <summary> /// 添加一个工作调度 /// </summary> /// <param name="entity"></param> /// <returns></returns> public async Task <BaseResult> AddScheduleJobAsync(ScheduleEntity entity) { var result = new BaseResult(); try { //检查任务是否已存在 var jobKey = new JobKey(entity.JobName, entity.JobGroup); if (await scheduler.CheckExists(jobKey)) { result.Code = 500; result.Msg = "任务已存在"; return(result); } //http请求配置 var httpDir = new Dictionary <string, string>() { { "RequestUrl", entity.RequestUrl }, { "RequestParameters", entity.RequestParameters }, { Constant.REQUESTTYPE, ((int)entity.RequestType).ToString() }, { "EndAt", entity.EndTime.ToString() }, { Constant.HEADERS, entity.Headers }, { Constant.MAILMESSAGE, ((int)entity.MailMessage).ToString() }, }; // 定义这个工作,并将其绑定到我们的IJob实现类 IJobDetail job = JobBuilder.Create <HttpJob>() .SetJobData(new JobDataMap(httpDir)) .WithDescription(entity.Description) .WithIdentity(entity.JobName, entity.JobGroup) .Build(); // 创建触发器 ITrigger trigger; //校验是否正确的执行周期表达式 if (entity.TriggerType == TriggerTypeEnum.Cron)//CronExpression.IsValidExpression(entity.Cron)) { trigger = CreateCronTrigger(entity); } else { trigger = CreateSimpleTrigger(entity); } // 告诉Quartz使用我们的触发器来安排作业 await scheduler.ScheduleJob(job, trigger); result.Code = 200; } catch (Exception ex) { result.Code = 505; result.Msg = ex.Message; } return(result); }
/// <summary> /// 创建类型Cron的触发器 /// </summary> /// <param name="entity"></param> /// <returns></returns> private ITrigger CreateCronTrigger(ScheduleEntity entity) { // 作业触发器 return(TriggerBuilder.Create() .WithIdentity(entity.JobName, entity.JobGroup) .StartAt(entity.BeginTime) //开始时间 .EndAt(entity.EndTime) //结束时间 .WithCronSchedule(entity.Cron, cronScheduleBuilder => cronScheduleBuilder.WithMisfireHandlingInstructionFireAndProceed()) //指定cron表达式 .ForJob(entity.JobName, entity.JobGroup) //作业名称 .Build()); }
/// <summary> /// 查询任务 /// </summary> /// <param name="jobGroup"></param> /// <param name="jobName"></param> /// <returns></returns> public async Task <ScheduleEntity> QueryJobAsync(string jobGroup, string jobName) { var entity = new ScheduleEntity(); var jobKey = new JobKey(jobName, jobGroup); var jobDetail = await scheduler.GetJobDetail(jobKey); var triggersList = await scheduler.GetTriggersOfJob(jobKey); var triggers = triggersList.AsEnumerable().FirstOrDefault(); var intervalSeconds = (triggers as SimpleTriggerImpl)?.RepeatInterval.TotalSeconds; var endTime = jobDetail.JobDataMap.GetString("EndAt"); entity.BeginTime = triggers.StartTimeUtc.LocalDateTime; if (!string.IsNullOrWhiteSpace(endTime)) { entity.EndTime = DateTime.Parse(endTime); } if (intervalSeconds.HasValue) { entity.IntervalSecond = Convert.ToInt32(intervalSeconds.Value); } entity.JobGroup = jobGroup; entity.JobName = jobName; entity.Cron = (triggers as CronTriggerImpl)?.CronExpressionString; entity.RunTimes = (triggers as SimpleTriggerImpl)?.RepeatCount; entity.TriggerType = triggers is SimpleTriggerImpl ? TriggerTypeEnum.Simple : TriggerTypeEnum.Cron; entity.MailMessage = (MailMessageEnum)int.Parse(jobDetail.JobDataMap.GetString(Constant.MAILMESSAGE) ?? "0"); entity.Description = jobDetail.Description; //旧代码没有保存JobTypeEnum,所以None可以默认为Url。 entity.JobType = (JobTypeEnum)int.Parse(jobDetail.JobDataMap.GetString(Constant.JobTypeEnum) ?? "1"); switch (entity.JobType) { case JobTypeEnum.None: break; case JobTypeEnum.Url: entity.RequestUrl = jobDetail.JobDataMap.GetString(Constant.REQUESTURL); entity.RequestType = (RequestTypeEnum)int.Parse(jobDetail.JobDataMap.GetString(Constant.REQUESTTYPE)); entity.RequestParameters = jobDetail.JobDataMap.GetString(Constant.REQUESTPARAMETERS); entity.Headers = jobDetail.JobDataMap.GetString(Constant.HEADERS); break; case JobTypeEnum.Emial: entity.MailTitle = jobDetail.JobDataMap.GetString(Constant.MailTitle); entity.MailContent = jobDetail.JobDataMap.GetString(Constant.MailContent); entity.MailTo = jobDetail.JobDataMap.GetString(Constant.MailTo); break; case JobTypeEnum.Mqtt: entity.Payload = jobDetail.JobDataMap.GetString(Constant.Payload); entity.Topic = jobDetail.JobDataMap.GetString(Constant.Topic); break; case JobTypeEnum.RabbitMQ: entity.RabbitQueue = jobDetail.JobDataMap.GetString(Constant.RabbitQueue); entity.RabbitBody = jobDetail.JobDataMap.GetString(Constant.RabbitBody); break; case JobTypeEnum.Hotreload: break; default: break; } return(entity); }
/// <summary> /// 添加一个工作调度 /// </summary> /// <param name="entity"></param> /// <param name="runNumber"></param> /// <returns></returns> public async Task <BaseResult> AddScheduleJobAsync(ScheduleEntity entity, long?runNumber = null) { var result = new BaseResult(); try { //检查任务是否已存在 var jobKey = new JobKey(entity.JobName, entity.JobGroup); if (await scheduler.CheckExists(jobKey)) { result.Code = 500; result.Msg = "任务已存在"; return(result); } //http请求配置 var httpDir = new Dictionary <string, string>() { { Constant.EndAt, entity.EndTime.ToString() }, { Constant.JobTypeEnum, ((int)entity.JobType).ToString() }, { Constant.MAILMESSAGE, ((int)entity.MailMessage).ToString() }, }; if (runNumber.HasValue) { httpDir.Add(Constant.RUNNUMBER, runNumber.ToString()); } IJobConfigurator jobConfigurator = null; if (entity.JobType == JobTypeEnum.Url) { jobConfigurator = JobBuilder.Create <HttpJob>(); httpDir.Add(Constant.REQUESTURL, entity.RequestUrl); httpDir.Add(Constant.HEADERS, entity.Headers); httpDir.Add(Constant.REQUESTPARAMETERS, entity.RequestParameters); httpDir.Add(Constant.REQUESTTYPE, ((int)entity.RequestType).ToString()); } else if (entity.JobType == JobTypeEnum.Emial) { jobConfigurator = JobBuilder.Create <MailJob>(); httpDir.Add(Constant.MailTitle, entity.MailTitle); httpDir.Add(Constant.MailContent, entity.MailContent); httpDir.Add(Constant.MailTo, entity.MailTo); } else if (entity.JobType == JobTypeEnum.Mqtt) { jobConfigurator = JobBuilder.Create <MqttJob>(); httpDir.Add(Constant.Topic, entity.Topic); httpDir.Add(Constant.Payload, entity.Payload); } else if (entity.JobType == JobTypeEnum.RabbitMQ) { jobConfigurator = JobBuilder.Create <RabbitJob>(); httpDir.Add(Constant.RabbitQueue, entity.RabbitQueue); httpDir.Add(Constant.RabbitBody, entity.RabbitBody); } // 定义这个工作,并将其绑定到我们的IJob实现类 IJobDetail job = jobConfigurator .SetJobData(new JobDataMap(httpDir)) .WithDescription(entity.Description) .WithIdentity(entity.JobName, entity.JobGroup) .Build(); // 创建触发器 ITrigger trigger; //校验是否正确的执行周期表达式 if (entity.TriggerType == TriggerTypeEnum.Cron)//CronExpression.IsValidExpression(entity.Cron)) { trigger = CreateCronTrigger(entity); } else { trigger = CreateSimpleTrigger(entity); } // 告诉Quartz使用我们的触发器来安排作业 await scheduler.ScheduleJob(job, trigger); result.Code = 200; } catch (Exception ex) { result.Code = 505; result.Msg = ex.Message; } return(result); }
internal void UpdateScheduleStatus(ScheduleEntity scheduleModel) { throw new NotImplementedException(); }