예제 #1
0
        public static TriggerBuilder TriggerFrequency(this TriggerBuilder triggerBuilder, IooinPlan plan)
        {
            if (plan.WithRepeatCount == 0)
            {
                return(triggerBuilder.WithSimpleSchedule(x => x.WithIntervalInSeconds(plan.WithIntervalInSeconds).RepeatForever()));
            }

            return(triggerBuilder.WithSimpleSchedule(x => x.WithIntervalInSeconds(plan.WithIntervalInSeconds).WithRepeatCount(plan.WithRepeatCount)));
        }
예제 #2
0
        /// <summary>
        /// 启动定时器框架-自动扫描注入启动
        /// </summary>
        /// <param name="app"></param>
        public static void UseQuartz(this IApplicationBuilder app)
        {
            var serviceProvider = app.ApplicationServices;
            var scheduler       = serviceProvider.GetRequiredService <IScheduler>();
            var jobFactory      = serviceProvider.GetRequiredService <IJobFactory>();

            scheduler.JobFactory = jobFactory;


            // add jobdetail with trigger to scheduler
            var jobs = app.ApplicationServices.GetServices <IJob>();

            foreach (var job in jobs)
            {
                var jobDesc    = job.GetType().GetCustomAttribute <JobDescriptionAttribute>();
                var jobBuilder = JobBuilder.Create(job.GetType());
                if (jobDesc != null)
                {
                    jobBuilder.WithIdentity(jobDesc.Key, jobDesc.Group).WithDescription(jobDesc.Description);
                }
                var jobDetail = jobBuilder.Build();

                ITrigger trigger;
                var      triggerDesc = job.GetType().GetCustomAttribute <IntervalTriggerAttribute>();
                if (triggerDesc == null)
                {
                    // default trigger
                    trigger = TriggerBuilder.Create().StartNow()
                              .WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever()).Build();
                }
                else
                {
                    TriggerBuilder temp = TriggerBuilder.Create().WithIdentity(triggerDesc.Key, triggerDesc.Group).WithDescription(triggerDesc.Description);
                    if (triggerDesc.StartNow)
                    {
                        temp = temp.StartNow();
                    }
                    if (triggerDesc.IsRepeatForever)
                    {
                        temp = temp.WithSimpleSchedule(x => x.WithIntervalInSeconds(triggerDesc.IntervalInSeconds)
                                                       .RepeatForever());
                    }
                    else
                    {
                        temp = temp.WithSimpleSchedule(x => x.WithIntervalInSeconds(triggerDesc.IntervalInSeconds)
                                                       .WithRepeatCount(triggerDesc.RepeatCount));
                    }
                    trigger = temp.Build();
                }
                scheduler.ScheduleJob(jobDetail, trigger).Wait();
            }
            scheduler.Start().Wait();
        }
예제 #3
0
        static IScheduler scheduler = null;//            sf.GetScheduler();

        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jobName"></param>
        /// <param name="triggerName"></param>
        /// <param name="item"></param>
        /// <param name="seconds">多久执行一次,</param>
        /// <param name="count">执行多少次</param>
        /// <param name="date"></param>
        public static void JobsEx <T>(string jobName, string triggerName, KeyValuePair <string, object>?item = null,
                                      int seconds = 1, int count = 1, DateTimeOffset?date = null)
        {
#if NET40 || NET45
            scheduler = sf.GetScheduler();
#else
            scheduler = sf.GetScheduler().Result;
#endif
            scheduler.Start();

            IJobDetail detail = JobBuilder.Create(typeof(T)).WithIdentity(jobName).Build(); //new JobDetailImpl(jobName, typeof(T));

            if (item.HasValue)
            {
                detail.JobDataMap.Add(item.Value);
            }

            TriggerBuilder builder = TriggerBuilder.Create().WithIdentity(triggerName); //TriggerBuilder.Create().WithIdentity(triggerName).StartAt(date.HasValue ? date.Value : DateTimeOffset.Now);
            if (date.HasValue)
            {
                builder = builder.StartAt(date.Value);
            }
            else
            {
                builder = builder.StartNow();
            }

            if (count > 1)
            {
                if (seconds < 1)
                {
                    seconds = 1;
                }
                builder = builder.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).WithRepeatCount(count - 1));
            }
            else
            {
                builder = builder.WithSimpleSchedule();
            }

            ITrigger trigger = builder.Build();
            scheduler.ScheduleJob(detail, trigger);

            LogHelper.Info("scheduler is start " + DateTime.Now.ToStringEx());
            //if (item.HasValue)
            //    logger.Info("scheduler param[" + JsonConvert.SerializeObject(item.Value) + "]", nameof(JobExtend));

            //logger.Info("scheduler is shutdown:" + scheduler.IsShutdown);
            //Console.WriteLine("scheduler is start" + DateTime.Now.ToString());
        }
        /// <summary>
        /// 应用触发器数据
        /// </summary>
        /// <param name="triggerName"></param>
        /// <param name="trigger"></param>
        /// <param name="triggerBuilder"></param>
        /// <returns></returns>
        private static TriggerBuilder ApplyTriggerData(string triggerName, TriggerType trigger, TriggerBuilder triggerBuilder)
        {
            if (!string.IsNullOrEmpty(triggerName))
            {
                triggerBuilder = triggerBuilder.WithIdentity(triggerName);
            }

            if (trigger is SimpleTriggerType simpleTrigger)
            {
                triggerBuilder = triggerBuilder.WithSimpleSchedule(x =>
                {
                    if (simpleTrigger.RepeatCount == -1)
                    {
                        x.RepeatForever();
                    }
                    else
                    {
                        x.WithRepeatCount(simpleTrigger.RepeatCount);
                    }

                    x.WithInterval(TimeSpan.FromMilliseconds(simpleTrigger.RepeatInterval));
                });
            }
            else if (trigger is CronTriggerType cronTriggerType)
            {
                triggerBuilder = triggerBuilder.WithCronSchedule(cronTriggerType.CronExpression);
            }
            else
            {
                throw new Exception("不支持的 trigger type: " + trigger.Code);
            }

            return(triggerBuilder);
        }
예제 #5
0
        public async Task <DateTimeOffset?> ScheduleRemoveOldEventsJob(int intervalSecs, DateTime?startAt)
        {
            ValidateRemoveOldEventsJobSchedule();
            TriggerBuilder builder = TriggerBuilder.Create()
                                     .WithIdentity(RemoveOldEventsTriggerKey);

            if (startAt != null)
            {
                builder = builder.StartAt(startAt.Value);
            }
            else
            {
                builder = builder.StartNow();
            }
            builder = builder.WithSimpleSchedule(x => x
                                                 .WithInterval(TimeSpan.FromSeconds(intervalSecs))
                                                 .RepeatForever());
            var trigger    = builder.ForJob(RemoveOldEventsJobKey).Build();
            var oldTrigger = await Scheduler.GetTrigger(RemoveOldEventsTriggerKey);

            if (oldTrigger != null)
            {
                return(await Scheduler.RescheduleJob(RemoveOldEventsTriggerKey, trigger));
            }
            return(await Scheduler.ScheduleJob(trigger));
        }
        public void Add(Task task)
        {
            if (task.next_date > DateTime.Now)
            {
                IJobDetail taskToNotify = JobBuilder.Create <Notification>().WithIdentity(task.JobKey).Build();
                taskToNotify.JobDataMap["Task"] = task;

                TriggerBuilder builder = TriggerBuilder.Create()
                                         .StartAt(task.next_date);


                if (task.period_min > 0)
                {
                    builder.WithSimpleSchedule(x => x
                                               .WithIntervalInMinutes(task.period_min)
                                               .RepeatForever())
                    .EndAt(task.next_date.AddMinutes(task.duration_min));
                }

                ITrigger trigger = builder
                                   .Build();

                scheduler.ScheduleJob(taskToNotify, trigger);
            }
        }
예제 #7
0
        /// <summary>
        /// Load DB Job and Trigger
        /// </summary>
        public virtual void GetJobTriggerFromDb()
        {
            var item = GetJobList();

            _logger.Info(string.Format("创建任务触发,JobUID={0},JobName={1}", item.JobUID, item.JobName));
            Type type = Type.GetType(item.JobClass);
            var  job  = JobBuilder.Create(type)
                        .WithIdentity(item.JobUID)
                        .UsingJobData("JobName", item.JobName)
                        .Build();
            TriggerBuilder simpleTriggerBuilder = TriggerBuilder.Create()
                                                  .WithIdentity(Guid.NewGuid().ToString())
                                                  .ForJob(job).StartNow();
            int simpleRepeatInterval = 6;

            if (!string.IsNullOrWhiteSpace(item.SimpleRepeatInterval))
            {
                simpleRepeatInterval = Convert.ToInt32(item.SimpleRepeatInterval);
            }
            simpleTriggerBuilder = simpleTriggerBuilder.WithSimpleSchedule(x => x
                                                                           .WithIntervalInSeconds(simpleRepeatInterval)//触发时间,秒
                                                                           .RepeatForever());
            var trigger = simpleTriggerBuilder.Build();

            if (scheduler.CheckExists(job.Key))
            {
                //schedule the job
                scheduler.ScheduleJob(trigger);
            }
            else
            {
                scheduler.ScheduleJob(job, trigger);
            }
        }
예제 #8
0
        public async override Task StartAsync(CancellationToken cancellationToken)
        {
            Log.Information("Starting JobWorker...");

            await _fFmpegInitializer.Intitialize();

            IScheduler scheduler = await _schedulerFactory
                                   .GetScheduler(cancellationToken);

            scheduler.JobFactory = _jobFactory;

            foreach (IJob job in _jobs)
            {
                Type jobType = job.GetType();
                Log.Information("Scheduling job {Name}", jobType.Name);

                JobScheduleOptions?options = _scheduleOptions
                                             .FirstOrDefault(x => x.Name == jobType.Name);

                if (options != null && options.Enabled)
                {
                    IJobDetail jobDetail = JobBuilder
                                           .Create(jobType)
                                           .WithIdentity(jobType.Name)
                                           .Build();

                    TriggerBuilder triggerBuilder = TriggerBuilder
                                                    .Create()
                                                    .WithIdentity(jobType.Name);

                    if (options.Interval.HasValue)
                    {
                        triggerBuilder.WithSimpleSchedule(s => s
                                                          .WithInterval(options.Interval.Value)
                                                          .RepeatForever());

                        Log.Information("Schedule job {Name} with intervall: {Interval}",
                                        jobType.Name,
                                        options.Interval);
                    }
                    else
                    {
                        triggerBuilder.WithCronSchedule(options.Cron !);
                        Log.Information("Schedule job {Name} with cron expression: {Cron}",
                                        jobType.Name,
                                        options.Cron);
                    }

                    await scheduler.ScheduleJob(jobDetail, triggerBuilder.Build(), cancellationToken);
                }
                else
                {
                    Log.Information("Job {Name} is not enabled", jobType.Name);
                }
            }

            await scheduler.Start();
        }
        public BaseResult AddTrigger(AddTriggerInput input)
        {
            var result = new BaseResult();

            try
            {
                TriggerBuilder triggerBuilder = TriggerBuilder
                                                .Create()
                                                .ForJob(input.Job, input.Group);

                if (!string.IsNullOrEmpty(input.Name))
                {
                    triggerBuilder = triggerBuilder.WithIdentity(input.Name);
                }

                switch (input.TriggerType)
                {
                case "Simple":
                    triggerBuilder = triggerBuilder.WithSimpleSchedule(x =>
                    {
                        if (input.RepeatForever)
                        {
                            x.RepeatForever();
                        }
                        else
                        {
                            x.WithRepeatCount(input.RepeatCount);
                        }

                        x.WithInterval(TimeSpan.FromMilliseconds(input.RepeatInterval));
                    });
                    if (!string.IsNullOrEmpty(input.StartDate))
                    {
                        var startDate = DateTimeOffset.Parse(input.StartDate);
                        triggerBuilder.StartAt(startDate);
                    }
                    break;

                case "Cron":
                    triggerBuilder = triggerBuilder.WithCronSchedule(input.CronExpression);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                _schedulerProvider.Scheduler.ScheduleJob(triggerBuilder.Build());
                result.Success = true;
            }
            catch (Exception ex)
            {
                result.ErrorMessage = ex.Message;
            }
            return(result);
        }
예제 #10
0
        public static ITrigger GetTrigger()
        {
            //创建一个触发器
            TriggerBuilder triggerBuilder = TriggerBuilder.Create();

            triggerBuilder.StartNow();                                                          //现在开始
            //triggerBuilder.WithCronSchedule("/5 * * ? * *");//时间表达式
            triggerBuilder.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()); //触发时间,5秒一次。
            ITrigger jobTrigger = triggerBuilder.Build();

            return(jobTrigger);
        }
예제 #11
0
        public static void ActivateSchedule(Schedule schedule)
        {
            TriggerBuilder builder = TriggerBuilder.Create()
                                     .WithIdentity(schedule.GetTriggerKey())
                                     .ForJob(schedule.GetJobKey());

            if (schedule.Type == ScheduleType.Daily)
            {
                builder.WithSimpleSchedule(x => x
                                           .WithIntervalInHours(24)
                                           .WithMisfireHandlingInstructionFireNow()
                                           .RepeatForever()
                                           )
                .StartAt(DateBuilder.DateOf(schedule.TimeSpan.Hours, schedule.TimeSpan.Minutes, schedule.TimeSpan.Seconds));
            }
            else if (schedule.Type == ScheduleType.Hourly)
            {
                builder.WithSimpleSchedule(x => x
                                           .WithIntervalInHours(1)
                                           .WithMisfireHandlingInstructionFireNow()
                                           .RepeatForever()
                                           )
                .StartAt(NextDateForHour(schedule.TimeSpan.Minutes, schedule.TimeSpan.Seconds));
            }
            else if (schedule.Type == ScheduleType.Minute)
            {
                builder.WithSimpleSchedule(x => x
                                           .WithIntervalInMinutes(schedule.TimeSpan.Minutes)
                                           .WithMisfireHandlingInstructionFireNow()
                                           .RepeatForever()
                                           )
                .StartAt(DateBuilder.DateOf(((DateTime.Now.Minute + schedule.TimeSpan.Minutes > 59) ? DateTime.Now.Hour + 1 : DateTime.Now.Hour) % 24, (DateTime.Now.Minute + schedule.TimeSpan.Minutes) % 60, DateTime.Now.Second));
            }

            ITrigger trigger = builder.Build();

            DefaultScheduler.UnscheduleJob(trigger.Key);
            DefaultScheduler.ScheduleJob(trigger);
        }
예제 #12
0
        public void TriggerJob(
            string jobName,
            string jobGroup,
            string triggerName,
            TriggerType trigger,
            IDictionary <string, object> jobData)
        {
            TriggerBuilder triggerBuilder = TriggerBuilder
                                            .Create()
                                            .ForJob(jobName, jobGroup);

            if (!string.IsNullOrEmpty(triggerName))
            {
                triggerBuilder = triggerBuilder.WithIdentity(triggerName);
            }

            SimpleTriggerType simpleTrigger = trigger as SimpleTriggerType;

            if (simpleTrigger != null)
            {
                triggerBuilder = triggerBuilder.WithSimpleSchedule(x =>
                {
                    if (simpleTrigger.RepeatCount == -1)
                    {
                        x.RepeatForever();
                    }
                    else
                    {
                        x.WithRepeatCount(simpleTrigger.RepeatCount);
                    }

                    x.WithInterval(TimeSpan.FromMilliseconds(simpleTrigger.RepeatInterval));
                });
            }
            else
            {
                CronTriggerType cronTriggerType = trigger as CronTriggerType;
                if (cronTriggerType != null)
                {
                    triggerBuilder = triggerBuilder.WithCronSchedule(cronTriggerType.CronExpression);
                }
            }

            if (jobData != null)
            {
                triggerBuilder = triggerBuilder.UsingJobData(new JobDataMap(jobData));
            }

            _scheduler.ScheduleJob(triggerBuilder.Build());
        }
예제 #13
0
        //WithSimpleSchedule
        private static void Scheduler1()
        {
            try
            {
                Console.ReadLine();

                //开启日志输出
                Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter {
                    Level = Common.Logging.LogLevel.Info
                };
                ILog log = LogManager.GetLogger(typeof(Program));

                //从计划器工作实例化一个计划实例;
                IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
                //定义一个job
                IJobDetail job = JobBuilder.Create <Job1>()
                                 .WithIdentity("job1", "grop1")
                                 .UsingJobData("jobSays", "Hello World!")
                                 .UsingJobData("myFloatValue", 3.141f)
                                 .Build();

                //定义一个trigger
                ITrigger       trigger        = null;
                TriggerBuilder triggerBuilder = TriggerBuilder.Create();


                triggerBuilder.WithIdentity("trigger1", "group1");
                triggerBuilder.StartNow();                                                          //按当前时间立即执行
                triggerBuilder.WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever()); //每3秒执行,永远重复
                trigger = triggerBuilder.Build();

                //开始为任务做计划
                DateTimeOffset dto = scheduler.ScheduleJob(job, trigger);

                // 计划任务开始
                scheduler.Start();

                // some sleep to show what's happening
                //Thread.Sleep(TimeSpan.FromSeconds(2));

                // and last shut down the scheduler when you are ready to close your program
                //scheduler.Shutdown();

                //Console.ReadLine();
            }
            catch (SchedulerException se)
            {
                Console.WriteLine(se);
            }
        }
예제 #14
0
        /// <summary>
        /// Adds new job to current Quartz scheduler
        /// Job executes at @period with @type units (e.g. 5 Seconds)
        /// 5 is the period, Seconds is the unit
        /// </summary>
        /// <param name="name">Name of job (same as profile)</param>
        /// <param name="group">Name of group (name of profile + '_Group')</param>
        /// <param name="period">Run Frequency</param>
        /// <param name="type">Run Frequency Type</param>
        /// <param name="profile">Profile</param>
        public static void AddJob(string name, string group, int period, Time type, object profile)
        {
            // Creating a custom JobDataMap to pass Profile to IJobdetail
            IDictionary <string, object> tmpDict = new Dictionary <string, object>();

            tmpDict.Add("profile", profile);
            JobDataMap jdmIncProfile = new JobDataMap(tmpDict);

            // Creating job object
            IJobDetail job = JobBuilder.Create <UpdateJob>()
                             .WithIdentity(name, group)
                             .SetJobData(jdmIncProfile)
                             .Build();

            // Building trigger, which runs for a duration of @period @type
            TriggerBuilder triggerBuild = TriggerBuilder.Create().WithIdentity(name + "_t", group);

            switch (type)
            {
            case Time.Hours:
                triggerBuild.WithSimpleSchedule(x => x.WithIntervalInHours(period).RepeatForever());
                break;

            case Time.Minutes:
                triggerBuild.WithSimpleSchedule(x => x.WithIntervalInMinutes(period).RepeatForever());
                break;

            case Time.Seconds:
                triggerBuild.WithSimpleSchedule(x => x.WithIntervalInSeconds(period).WithRepeatCount(10));
                break;
            }


            ITrigger builtTrigger = triggerBuild.Build();

            s.ScheduleJob(job, builtTrigger);
        }
예제 #15
0
        /// <summary>
        /// 两个问题有QuartzModel 有了对象还要这个做什么?二考虑把 QuartzModelList 这个分出去
        /// </summary>
        public bool Update(string jobName)
        {
            if (this.QuartzSchedule == null || string.IsNullOrEmpty(jobName))
            {
                return(false);
            }

            string dllName = jobName + "QuartzTask.dll";
            string path    = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, jobName, dllName);

            byte[]   assemblyBuf = File.ReadAllBytes(path);
            Assembly assembly    = Assembly.Load(assemblyBuf);

            Type type = assembly.GetType(dllName + "." + jobName);

            if (type == null)
            {
                return(false);
            }
            object[] objs = type.GetCustomAttributes(typeof(ScanSignal), true);
            if (objs != null && objs.Length > 0)
            {
                JobBase     job1             = Activator.CreateInstance(type) as JobBase;
                QuartzModel model            = null;
                ScanSignal  customScanSignal = objs[0] as ScanSignal;
                if (customScanSignal != null)
                {
                    IJobDetail job = JobBuilder.Create(type)
                                     .WithIdentity(customScanSignal.JobName, QuartzGroupLevel.GetGroupLevelName(customScanSignal.GroupLevel))
                                     .UsingJobData(new JobDataMap(job1.map))
                                     .Build();
                    TriggerBuilder triggerBuilder = TriggerBuilder.Create()
                                                    .WithIdentity(customScanSignal.JobName + "trigger", QuartzGroupLevel.GetGroupLevelName(customScanSignal.GroupLevel))
                                                    .StartNow();
                    if (String.IsNullOrEmpty(customScanSignal.CronExpression))
                    {
                        triggerBuilder.WithSimpleSchedule(x => x.WithInterval(customScanSignal.TimeSpan).RepeatForever());
                    }
                    else
                    {
                        triggerBuilder.WithCronSchedule(customScanSignal.CronExpression);
                    }
                    ITrigger trigger = triggerBuilder.Build();
                    model = new QuartzModel(customScanSignal.JobName, job, trigger);
                    return(this.QuartzSchedule.UpdateJob(model, model) != null);
                }
            }
            return(false);
        }
예제 #16
0
        /// <summary>
        /// 根据数据采集计划来创建作业触发器
        /// </summary>
        /// <param name="jobDetail">采集计划</param>
        /// <param name="clMethod">数据采集方法</param>
        /// <param name="forJob">将此触发器添加到哪个作业</param>
        /// <returns></returns>
        public static ITrigger CreateTrigger(ScheduleJob_Details_Triggers trigger, IJobDetail forJob = null)
        {
            if (trigger == null)
            {
                throw new ArgumentNullException("『CreateTrigger』的trigger参数为空!");
            }
            TriggerBuilder builder = TriggerBuilder.Create();

            builder =
                builder
                .WithIdentity(GetTriggerKey(trigger))
                .WithDescription(trigger.description);
            builder =
                trigger.trigger_type.ToUpper() == "cron".ToUpper() ? (
                    string.IsNullOrEmpty(trigger.cronexpression) ?
                    builder.WithSimpleSchedule(x => x.WithIntervalInMinutes(string.IsNullOrEmpty(trigger.repeat_interval) ? 30 : int.Parse(trigger.repeat_interval)).WithRepeatCount(string.IsNullOrEmpty(trigger.repeat_count) ? 10 : int.Parse(trigger.repeat_count)))
                    : builder.WithCronSchedule(trigger.cronexpression)
                    ) : builder.WithSimpleSchedule(x => x.WithIntervalInMinutes(string.IsNullOrEmpty(trigger.repeat_interval) ? 30 : int.Parse(trigger.repeat_interval)).WithRepeatCount(string.IsNullOrEmpty(trigger.repeat_count) ? 10 : int.Parse(trigger.repeat_count)));
            if (forJob != null)
            {
                builder.ForJob(forJob);
            }
            return(builder.Build());
        }
예제 #17
0
        public void Apply(TriggerBuilder builder, TriggerPropertiesViewModel model)
        {
            builder.WithSimpleSchedule(x =>
            {
                x.WithInterval(GetRepeatIntervalTimeSpan());

                if (RepeatForever)
                {
                    x.RepeatForever();
                }
                else
                {
                    x.WithRepeatCount(RepeatCount.Value);
                }

                switch (model.MisfireInstruction)
                {
                case InstructionNotSet:
                    break;

                case IgnoreMisfirePolicy:
                    x.WithMisfireHandlingInstructionIgnoreMisfires();
                    break;

                case SimpleTrigger.FireNow:
                    x.WithMisfireHandlingInstructionFireNow();
                    break;

                case SimpleTrigger.RescheduleNowWithExistingRepeatCount:
                    x.WithMisfireHandlingInstructionNowWithExistingCount();
                    break;

                case SimpleTrigger.RescheduleNowWithRemainingRepeatCount:
                    x.WithMisfireHandlingInstructionNowWithRemainingCount();
                    break;

                case SimpleTrigger.RescheduleNextWithRemainingCount:
                    x.WithMisfireHandlingInstructionNextWithExistingCount();
                    break;

                default:
                    throw new ArgumentException("Invalid value: " + model.MisfireInstruction, nameof(model.MisfireInstruction));
                }
            });
        }
예제 #18
0
        /// <summary>
        /// 创建任务触发器
        /// </summary>
        /// <param name="job"></param>
        /// <param name="group"></param>
        /// <returns></returns>
        private static ITrigger CeateTrigger(ScheduleJobsInfo job, string group)
        {
            string triggerName = "trigger_" + job.Id.ToString();

            TriggerBuilder triggerBuilder = TriggerBuilder.Create().WithIdentity(triggerName, "trigger_" + group);

            if (job.Mode == JobMode.OnlyOnce || job.Mode == JobMode.OnceWhenServieStart)
            {
                triggerBuilder = triggerBuilder.WithSimpleSchedule(x => x.WithRepeatCount(0)).StartNow();
            }
            else
            {
                triggerBuilder = triggerBuilder.WithCronSchedule(job.RunPlan);
            }
            ITrigger trigger = triggerBuilder.Build();

            return(trigger);
        }
예제 #19
0
        /// <summary>
        /// Утановить интервал для триггера
        /// </summary>
        /// <param name="triggerBuilder">Билдер триггера</param>
        /// <param name="settings">Настройки триггера</param>
        /// <returns>Билдер триггера</returns>
        public static TriggerBuilder SetInterval(this TriggerBuilder triggerBuilder, TriggerSettings settings)
        => triggerBuilder.WithSimpleSchedule(builder =>
        {
            switch (settings.IntervalUnit)
            {
            case IntervalUnit.Millisecond:
                builder.WithInterval(TimeSpan.FromMilliseconds(settings.Interval));
                break;

            case IntervalUnit.Second:
                builder.WithIntervalInSeconds(settings.Interval);
                break;

            case IntervalUnit.Minute:
                builder.WithIntervalInMinutes(settings.Interval);
                break;

            case IntervalUnit.Hour:
                builder.WithIntervalInHours(settings.Interval);
                break;

            case IntervalUnit.Day:
                builder.WithInterval(TimeSpan.FromDays(settings.Interval));
                break;

            case IntervalUnit.Week:
                builder.WithInterval(TimeSpan.FromDays(settings.Interval * 7));
                break;

            case IntervalUnit.Month:
                builder.WithInterval(TimeSpan.FromDays(settings.Interval * 30));
                break;

            case IntervalUnit.Year:
                builder.WithInterval(TimeSpan.FromDays(settings.Interval * 365));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            builder.RepeatForever();
        });
예제 #20
0
 public static TriggerBuilder TriggerInterval_(this TriggerBuilder builder,
                                               TimeSpan interval, string name, string group = null, DateTimeOffset?start = null, int?repeat_count = null)
 {
     builder = builder.WithIdentity_(name, group);
     builder = builder.WithSimpleSchedule(x =>
     {
         x = x.WithIntervalInSeconds((int)interval.TotalSeconds);
         if (repeat_count == null)
         {
             x = x.RepeatForever();
         }
         else
         {
             x = x.WithRepeatCount(repeat_count.Value);
         }
     });
     builder = builder.Start_(start);
     return(builder);
 }
예제 #21
0
        protected override async Task InternalExecute(AddTriggerInput input, CommandResultWithErrorDetails output)
        {
            TriggerBuilder triggerBuilder = TriggerBuilder
                                            .Create()
                                            .ForJob(input.Job, input.Group);

            if (!string.IsNullOrEmpty(input.Name))
            {
                triggerBuilder = triggerBuilder.WithIdentity(input.Name);
            }

            switch (input.TriggerType)
            {
            case "Simple":
                triggerBuilder = triggerBuilder.WithSimpleSchedule(x =>
                {
                    if (input.RepeatForever)
                    {
                        x.RepeatForever();
                    }
                    else
                    {
                        x.WithRepeatCount(input.RepeatCount);
                    }

                    x.WithInterval(TimeSpan.FromMilliseconds(input.RepeatInterval));
                });
                break;

            case "Cron":
                triggerBuilder = triggerBuilder.WithCronSchedule(input.CronExpression);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            await(await Scheduler().ConfigureAwait(false)).ScheduleJob(triggerBuilder.Build()).ConfigureAwait(false);
        }
예제 #22
0
        /// <summary>
        /// 创建 Trigger
        /// </summary>
        /// <param name="jobInfo"></param>
        /// <returns></returns>
        private ITrigger CreateTrigger(JobInfo jobInfo)
        {
            TriggerBuilder tiggerBuilder = TriggerBuilder.Create().WithIdentity(jobInfo.JobName, jobInfo.JobGroup);

            if (!string.IsNullOrWhiteSpace(jobInfo.Cron))
            {
                //错过的不管了,剩下的按正常执行。
                //tiggerBuilder.WithCronSchedule(jobInfo.Cron, c => c.WithMisfireHandlingInstructionDoNothing());

                ////错过的合并为一次执行,后续正常执行。
                tiggerBuilder.WithCronSchedule(jobInfo.Cron, c => c.WithMisfireHandlingInstructionFireAndProceed());

                ////错过的马上执行掉,后续正常执行
                //tiggerBuilder.WithCronSchedule(jobInfo.Cron, c => c.WithMisfireHandlingInstructionIgnoreMisfires());
            }
            else
            {
                tiggerBuilder.WithSimpleSchedule(simple =>
                {
                    //按正常频率执行未执行过的次数
                    simple.WithIntervalInSeconds(jobInfo.Second).RepeatForever().WithMisfireHandlingInstructionNextWithExistingCount();
                });
            }

            if (jobInfo.StartTime > DateTime.Now)
            {
                tiggerBuilder.StartAt(jobInfo.StartTime);
            }
            else
            {
                tiggerBuilder.StartNow();
            }

            ITrigger trigger = tiggerBuilder.Build();

            return(trigger);
        }
예제 #23
0
 private TriggerBuilder SimpleBuilder(TriggerBuilder builder, Jobs jobInfo)
 {
     builder.WithSimpleSchedule(s =>
     {
         var interval = jobInfo.TriggerInterval;
         var count    = jobInfo.Intervals;
         if (interval == TriggerInterval.seconds)
         {
             s.WithIntervalInSeconds(count);
         }
         else if (interval == TriggerInterval.minutes)
         {
             s.WithIntervalInMinutes(count);
         }
         else
         {
             s.WithIntervalInHours(count);
         }
         s.RepeatForever();
         //哑火策略,当前默认
         s.WithMisfireHandlingInstructionNextWithExistingCount();
     });
     return(builder);
 }
 public override TriggerBuilder GetSchedule(TriggerBuilder trigger)
 {
     return(trigger.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).WithRepeatCount(5)));
 }
예제 #25
0
        /// <summary>
        /// 成功返回true ,false 失败有可能是已经存在或找不到jobname
        /// </summary>
        /// <param name="jobName"></param>
        /// <returns></returns>
        public IQuartzTask Add(string jobName)
        {
            if (this.QuartzSchedule == null || String.IsNullOrWhiteSpace(jobName))
            {
                return(null);
            }
            string dllName = jobName + "QuartzTask.dll";
            string path    = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, jobName, dllName);

            string plugName     = string.Concat(jobName, "Plug.txt");
            string plugNamepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, jobName, plugName);
            var    plugdic      = configurationReader.Read(plugNamepath);

            byte[]   assemblyBuf = File.ReadAllBytes(path);
            Assembly assembly    = Assembly.Load(assemblyBuf);

            Type type = assembly.GetType(Path.GetFileNameWithoutExtension(dllName) + "." + jobName);

            if (type.GetInterface("IQuartzService") != null)
            {
                QuartzModel           model         = null;
                AssemblyDynamicLoader dyNamicLoader = new AssemblyDynamicLoader(jobName);
                dyNamicLoader.LoadAssembly(path);

                TaskBase task = new TaskBase();
                IDictionary <string, object> dic = task.map;
                dic.Add("DyNamicLoader", dyNamicLoader);
                dic.Add("DyNamicMethod", Path.GetFileNameWithoutExtension(dllName) + "." + jobName);
                string timePression     = "";
                long   timelongPression = 1000;
                bool   bl = false;
                bl = plugdic.TryGetValue("CRONEXPRESSION", out timePression);
                if (!bl)
                {
                    if (plugdic.TryGetValue("TIMESPAN", out timePression))
                    {
                        if (!long.TryParse(timePression, out timelongPression))
                        {
                            timePression = "1000";
                        }
                    }
                }

                IJobDetail job = JobBuilder.Create(task.GetType())
                                 .WithIdentity(plugdic["JOBNAME"], plugdic["GROUPNAME"])
                                 .UsingJobData(new JobDataMap(dic))
                                 .Build();

                TriggerBuilder triggerBuilder = TriggerBuilder.Create()
                                                .WithIdentity(plugdic["JOBNAME"] + "TRIGGER", plugdic["GROUPNAME"])
                                                .StartNow();
                if (bl)
                {
                    triggerBuilder.WithCronSchedule(timePression);
                }
                else
                {
                    triggerBuilder.WithSimpleSchedule
                        (x => x.WithInterval(new TimeSpan(timelongPression))
                        .RepeatForever());
                }
                ITrigger trigger = triggerBuilder.Build();
                model = new QuartzModel(plugdic["JOBNAME"], job, trigger);
                if (!this.QuartzSchedule.CheckExists(model))
                {
                    this.QuartzSchedule.AddJob(model);
                }
            }
            return(null);
        }
예제 #26
0
        internal void ScanQuartzExterior()
        {
            string runroot = AppDomain.CurrentDomain.BaseDirectory;
            var    subDir  = Directory.GetDirectories(runroot);

            foreach (var dir in subDir)
            {
                var    dinfo        = new DirectoryInfo(dir);
                string dllName      = string.Concat(dinfo.Name, "QuartzTask.dll");
                string path         = Path.Combine(dir, dllName);
                string plugName     = string.Concat(dinfo.Name, "Plug.txt");
                string plugNamepath = Path.Combine(dir, plugName);
                if (!File.Exists(plugNamepath))
                {
                    continue;
                }
                var plugdic = configurationReader.Read(plugNamepath);
                try
                {
                    byte[]   assemblyBuf = File.ReadAllBytes(path);
                    Assembly assembly    = Assembly.Load(assemblyBuf);
                    Type[]   types       = assembly.GetTypes();
                    foreach (var item in types)
                    {
                        if (item.GetInterface("IQuartzService") != null)
                        {
                            QuartzModel           model         = null;
                            AssemblyDynamicLoader dyNamicLoader = new AssemblyDynamicLoader(dinfo.Name);
                            dyNamicLoader.LoadAssembly(path);

                            TaskBase task = new TaskBase();
                            IDictionary <string, object> dic = task.map;
                            dic.Add("DyNamicLoader", dyNamicLoader);
                            dic.Add("DyNamicMethod", Path.GetFileNameWithoutExtension(dllName) + "." + dinfo.Name);
                            string timePression     = "";
                            int    timelongPression = 1000;
                            bool   bl = false;
                            bl = plugdic.TryGetValue("CRONEXPRESSION", out timePression);
                            if (!bl)
                            {
                                if (plugdic.TryGetValue("TIMESPAN", out timePression))
                                {
                                    if (!int.TryParse(timePression, out timelongPression))
                                    {
                                        timePression = "1000";
                                    }
                                }
                            }

                            IJobDetail job = JobBuilder.Create(task.GetType())
                                             .WithIdentity(plugdic["JOBNAME"], plugdic["GROUPNAME"])
                                             .UsingJobData(new JobDataMap(dic))
                                             .Build();

                            TriggerBuilder triggerBuilder = TriggerBuilder.Create()
                                                            .WithIdentity(plugdic["JOBNAME"] + "TRIGGER", plugdic["GROUPNAME"])
                                                            .StartNow();
                            if (bl)
                            {
                                triggerBuilder.WithCronSchedule(timePression);
                            }
                            else
                            {
                                triggerBuilder.WithSimpleSchedule
                                    (x => x.WithInterval(new TimeSpan(0, 0, 0, 0, timelongPression))
                                    .RepeatForever());
                            }
                            ITrigger trigger = triggerBuilder.Build();
                            model = new QuartzModel(plugdic["JOBNAME"], job, trigger);
                            if (!this.QuartzSchedule.CheckExists(model))
                            {
                                this.QuartzSchedule.AddJob(model);
                            }
                        }
                    }
                }
                catch (Exception oe)
                {
                    Debug.WriteLine(oe.Message);
                }
            }
        }
예제 #27
0
        public IQuartzTask Add(PlugModel plug)
        {
            if (this.QuartzSchedule == null || plug == null)
            {
                return(null);
            }

            string runroot = AppDomain.CurrentDomain.BaseDirectory;
            string path    = Path.Combine(
                runroot,
                plug.DllRelativeDir,
                plug.DllIQuartzServiceImplementFile
                );

            if (!File.Exists(path))
            {
                throw new ArgumentException("找不到需要载入的目录或文件", path);
            }
            byte[]   assemblyBuf = File.ReadAllBytes(path);
            Assembly assembly    = null;

            if (assemblyBuf.Length > 0)
            {
                assembly = Assembly.Load(assemblyBuf);
            }
            else
            {
                return(null);
            }
            Type[] types = assembly.GetTypes();
            try
            {
                foreach (var type in types)
                {
                    if (type.GetInterface("IQuartzService") != null)
                    {
                        QuartzModel           model         = null;
                        AssemblyDynamicLoader dyNamicLoader = new AssemblyDynamicLoader(plug.DllRelativeDir);
                        dyNamicLoader.LoadAssembly(path);

                        TaskBase task = new TaskBase();
                        IDictionary <string, object> dic = task.map;
                        dic.Add("DyNamicLoader", dyNamicLoader);
                        dic.Add("DyNamicMethod", type.FullName);
                        IJobDetail job = JobBuilder.Create(task.GetType())
                                         .WithIdentity(plug.JobName, plug.GroupName)
                                         .UsingJobData(new JobDataMap(dic))
                                         .Build();

                        TriggerBuilder triggerBuilder = TriggerBuilder.Create()
                                                        .WithIdentity(plug.JobName + "Trigger", plug.GroupName)
                                                        .StartNow();

                        if (!string.IsNullOrEmpty(plug.CronexPression))
                        {
                            triggerBuilder.WithCronSchedule(plug.CronexPression);
                        }
                        else
                        {
                            triggerBuilder.WithSimpleSchedule
                                (x => x.WithInterval(new TimeSpan(0, 0, 0, 0, plug.TimeSpan))
                                .RepeatForever());
                        }

                        ITrigger trigger = triggerBuilder.Build();
                        model = new QuartzModel(plug.JobName, job, trigger);
                        return(Add(model));
                    }
                }
            }
            catch (Exception oe)
            {
                Debug.WriteLine(oe.Message);
            }
            return(null);
        }
예제 #28
0
        public async Task CreateOrUpdate(JobCreateOrUpdateRequest request)
        {
            request.Name  = request.Name.Trim();
            request.Group = request.Group.Trim();

            JobKey key = new JobKey(request.Name, request.Group);

            if (await _scheduler.CheckExists(key))
            {
                if (!request.IsUpdate)
                {
                    throw new Exception("已存在相同名称的任务");                    // 新增时,存在相同任务,不创建
                }
                else
                {
                    await _scheduler.DeleteJob(key);    // 更新时,先删除,再创建
                }
            }
            ;

            /******Data*****/
            JobDataMap dataMap = new JobDataMap();

            dataMap.Put(DataKeys.HttpMethod, request.HttpMethod);
            dataMap.Put(DataKeys.RequestUrl, request.RequestUrl);
            dataMap.Put(DataKeys.TriggerType, request.TriggerType);
            dataMap.Put(DataKeys.RepeatCount, request.RepeatCount);
            dataMap.Put(DataKeys.Interval, request.Interval);
            dataMap.Put(DataKeys.IntervalType, request.IntervalType);
            dataMap.Put(DataKeys.Cron, request.Cron);
            dataMap.Put(DataKeys.RequestBody, request.RequestBody);
            dataMap.Put(DataKeys.CreateTime, DateTime.Now.ToString());
            dataMap.Put(DataKeys.StartTime, request.StartTime.ToString());
            dataMap.Put(DataKeys.EndTime, request.EndTime.HasValue ? request.EndTime.Value.ToString() : string.Empty);

            /******Job*****/
            IJobDetail job = JobBuilder.Create <HttpJob>()
                             .StoreDurably(true) // 是否持久化, 无关联触发器时是否移除,false:移除
                             .RequestRecovery()  // 重启后是否恢复任务
                             .WithDescription(request.Description ?? string.Empty)
                             .WithIdentity(request.Name, request.Group)
                             .UsingJobData(dataMap)
                             .Build();

            /******Trigger*****/
            TriggerBuilder builder = TriggerBuilder.Create()
                                     .WithIdentity(request.Name, request.Group)
                                     .StartAt(request.StartTime.Value)
                                     .ForJob(job);

            if (request.EndTime.HasValue)
            {
                builder.EndAt(request.EndTime.Value);
            }
            if (request.TriggerType == (int)TriggerTypeEnum.Simple)
            {
                builder.WithSimpleSchedule(simple =>
                {
                    if (request.IntervalType == (int)IntervalTypeEnum.Second)
                    {
                        simple.WithIntervalInSeconds(request.Interval);
                    }
                    if (request.IntervalType == (int)IntervalTypeEnum.Minute)
                    {
                        simple.WithIntervalInMinutes(request.Interval);
                    }
                    if (request.IntervalType == (int)IntervalTypeEnum.Hour)
                    {
                        simple.WithIntervalInHours(request.Interval);
                    }
                    if (request.IntervalType == (int)IntervalTypeEnum.Day)
                    {
                        simple.WithIntervalInHours(request.Interval * 24);
                    }

                    if (request.RepeatCount > 0)
                    {
                        simple.WithRepeatCount(request.RepeatCount);
                    }
                    else
                    {
                        simple.RepeatForever();
                    }
                    simple.WithMisfireHandlingInstructionFireNow(); // 如果延迟执行了
                });
            }
            else
            {
                builder.WithCronSchedule(request.Cron, cron =>
                {
                    cron.WithMisfireHandlingInstructionFireAndProceed();
                });
            }

            ITrigger trigger = builder.Build();

            await _scheduler.ScheduleJob(job, trigger); // 加入调度,并持久化

            FlushCache();
        }
예제 #29
0
        private static void ScheduleJobs()
        {
            int priority = Jobs.Count;

            foreach (var tsk in Jobs.Where(x => x.TaskType == "S" && x.Status == "Queued")) // O - On Demand ; S- Scheduled.
            {
                var schedule = Schedules.FirstOrDefault(x => x.taskID == tsk.taskID);
                var client   = Machines.FirstOrDefault(x => x.ID == tsk.ClientID);

                IJobDetail job = JobBuilder.Create <Job>().WithIdentity(tsk.TaskName, tsk.ClientID.ToString()).Build();
                job.JobDataMap["command"]  = tsk.Command;
                job.JobDataMap["taskname"] = tsk.TaskName;
                job.JobDataMap["TaskId"]   = tsk.taskID;
                if (client != null)
                {
                    job.JobDataMap["remotepc"] = "\\\\" + client.HostName;
                    job.JobDataMap["username"] = client.Username;
                    job.JobDataMap["password"] = client.Password;
                }


                if (schedule != null)
                {
                    TriggerBuilder tb = TriggerBuilder.Create();
                    tb.WithIdentity(tsk.TaskName);

                    if (schedule.repeatforever <= 0)
                    {
                        tb.WithSimpleSchedule(a => a.WithIntervalInHours(schedule.intHours));
                        tb.WithSimpleSchedule(a => a.WithIntervalInSeconds(schedule.intSec));
                        tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(schedule.intMin));
                    }
                    else
                    {
                        if (schedule.intHours > 0)
                        {
                            tb.WithSimpleSchedule(a => a.WithIntervalInHours(schedule.intHours).RepeatForever());
                        }
                        if (schedule.intHours > 0)
                        {
                            tb.WithSimpleSchedule(a => a.WithIntervalInSeconds(schedule.intSec).RepeatForever());
                        }
                        if (schedule.intHours > 0)
                        {
                            tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(schedule.intMin).RepeatForever());
                        }
                    }

                    if (schedule.startAt != null)
                    {
                        tb.StartAt(new DateTimeOffset((DateTime)schedule.startAt));
                    }
                    if (schedule.endAt != null)
                    {
                        tb.EndAt(new DateTimeOffset((DateTime)schedule.endAt));
                    }



                    tb.ForJob(job);
                    ITrigger trigger = tb.Build();
                    Scheduler.ScheduleJob(job, trigger);
                }
            }
        }
예제 #30
0
        public void AddJob(JobInfo jobInfo)
        {
            if (string.IsNullOrEmpty(jobInfo.JobName) || string.IsNullOrEmpty(jobInfo.GroupName))
            {
                throw new Exception("job名称与组名都不能为空");
            }

            if (jobInfo.StartTime < new DateTime(1900, 1, 1))
            {
                throw new Exception("开始时间不正确");
            }

            if (string.IsNullOrEmpty(jobInfo.FileName) || string.IsNullOrEmpty(jobInfo.ClassName))
            {
                throw new Exception("程序集地址和类名都不能为空");
            }

            // 反射获取job实例
            Assembly assembly = Consts.GetAssembly(jobInfo.FileName);
            BaseJob  job      = assembly.CreateInstance(jobInfo.ClassName) as BaseJob;

            if (job == null)
            {
                throw new Exception("无法实例化job类");
            }

            JobBuilder jobBuilder = null;

            if (jobInfo.CanConcurrent)
            {
                jobBuilder = JobBuilder.Create <HostJob>();              // 可以多线程
            }
            else
            {
                jobBuilder = JobBuilder.Create <HostJob>();        // 不能多线程
            }

            IJobDetail innerJob = jobBuilder
                                  .WithIdentity(jobInfo.JobName, jobInfo.GroupName)
                                  .UsingJobData(Consts.JobParameter, jobInfo.Parameter)
                                  .UsingJobData(Consts.JobAssemblyPath, jobInfo.FileName)
                                  .UsingJobData(Consts.JobClassName, jobInfo.ClassName)
                                  .RequestRecovery(true)
                                  .Build();

            TriggerBuilder builder = TriggerBuilder.Create().WithIdentity(jobInfo.JobName, jobInfo.GroupName);

            if (jobInfo.RepeatMode == RepeatModeEnum.Interval)
            {
                if (jobInfo.Interval <= 0)
                {
                    throw new Exception("时间间隔必须大于0");
                }

                switch (jobInfo.CycleUnit)
                {
                case CycleUnitEnum.Day:
                    builder = builder.WithSimpleSchedule(x => x.WithIntervalInHours(24 * jobInfo.Interval).RepeatForever().WithMisfireHandlingInstructionIgnoreMisfires());
                    break;

                case CycleUnitEnum.Hour:
                    builder = builder.WithSimpleSchedule(x => x.WithIntervalInHours(jobInfo.Interval).RepeatForever().WithMisfireHandlingInstructionIgnoreMisfires());
                    break;

                case CycleUnitEnum.Minute:
                    builder = builder.WithSimpleSchedule(x => x.WithIntervalInMinutes(jobInfo.Interval).RepeatForever().WithMisfireHandlingInstructionIgnoreMisfires());
                    break;

                case CycleUnitEnum.Second:
                    builder = builder.WithSimpleSchedule(x => x.WithIntervalInSeconds(jobInfo.Interval).RepeatForever().WithMisfireHandlingInstructionIgnoreMisfires());
                    break;
                }
            }
            else if (jobInfo.RepeatMode == RepeatModeEnum.FixedTime)
            {
                if (string.IsNullOrEmpty(jobInfo.FixedExpression))
                {
                    throw new Exception("Job按固定时间配置时,固定时间的表达式不能为空");
                }

                var expression = string.Empty;
                var fixedExs   = jobInfo.FixedExpression.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                var localParts = fixedExs[0].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

                switch (jobInfo.FixedUnit)
                {
                case FixedUnitEnum.Day:
                    var localMinute   = Convert.ToInt32(localParts[1]);
                    var localSecond   = Convert.ToInt32(localParts[2]);
                    var localHourList = new List <int>();
                    foreach (var item in fixedExs)
                    {
                        localParts = item.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                        localHourList.Add(Convert.ToInt32(localParts[0]));
                    }
                    var localHours = string.Join(",", localHourList);
                    expression = string.Format("{0} {1} {2} * * ?", localSecond, localMinute, localHours);

                    break;

                case FixedUnitEnum.Hour:
                    localSecond = Convert.ToInt32(localParts[1]);
                    var localMinuteList = new List <int>();
                    foreach (var item in fixedExs)
                    {
                        localParts = item.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                        localMinuteList.Add(Convert.ToInt32(localParts[0]));
                    }
                    var localMinutes = string.Join(",", localMinuteList);
                    expression = string.Format("{0} {1} * * * ?", localSecond, localMinutes);

                    break;
                }

                builder = builder.WithCronSchedule(expression,
                                                   x => x.WithMisfireHandlingInstructionIgnoreMisfires().InTimeZone(TimeZoneInfo.Local));
            }
            else if (jobInfo.RepeatMode == RepeatModeEnum.CronExp)
            {
                builder = builder.WithCronSchedule(jobInfo.FixedExpression,
                                                   x => x.WithMisfireHandlingInstructionIgnoreMisfires().InTimeZone(TimeZoneInfo.Local));
            }

            if (jobInfo.StartTime < DateTime.Now.AddMinutes(1))
            {
                jobInfo.StartTime = DateTime.Now.AddMinutes(1);
            }
            builder.StartAt(jobInfo.StartTime);
            ITrigger trigger = builder.Build();

            HostScheduler.RegisterJob(innerJob, trigger);
        }