示例#1
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));
        }
示例#2
0
        public async Task <JobKey> ScheduleJob <T>(DateTimeOffset?startAtTime = null, JobKey?vncCheckerJobKey = null)
            where T : class, IJob
        {
            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();

            await scheduler.Start();

            IJobDetail jobDetail = JobBuilder.Create <T>().Build();

            ITrigger       trigger;
            TriggerBuilder triggerBuilder = TriggerBuilder.Create().StartNow()
                                            .WithSimpleSchedule(x => x.WithIntervalInSeconds(Constants.JobEecutionIntervalSec)
                                                                .RepeatForever());

            if (vncCheckerJobKey != null)
            {
                triggerBuilder = triggerBuilder.UsingJobData(nameof(Checker), vncCheckerJobKey.Name);
            }

            if (startAtTime != null)
            {
                trigger = triggerBuilder.StartAt((DateTimeOffset)startAtTime).Build();
            }
            else
            {
                trigger = triggerBuilder.StartNow().Build();
            }

            await scheduler.ScheduleJob(jobDetail, trigger);

            return(jobDetail.Key);
        }
示例#3
0
        /// <summary>
        /// 开启任务
        /// </summary>
        public void Start()
        {
            ISchedulerFactory factory   = new StdSchedulerFactory();
            IScheduler        scheduler = factory.GetScheduler().Result;

            foreach (TaskInfo info in tasks)
            {
                if (info.IsEnabled)
                {
                    Type type = Type.GetType(info.TaskType);
                    if (type != null)
                    {
                        string     name      = type.Name + "_trigger";
                        IJobDetail jobDetail = JobBuilder.Create(typeof(QuartzTask)).WithIdentity(type.Name).Build();
                        jobDetail.JobDataMap.Add(new KeyValuePair <string, object>("Id", info.Id));
                        TriggerBuilder builder = TriggerBuilder.Create().WithIdentity(name).WithCronSchedule(info.TaskRule);
                        if (info.StartDate > DateTime.MinValue)
                        {
                            builder.StartAt(new DateTimeOffset(info.StartDate));
                        }
                        DateTime?endDate   = info.EndDate;
                        DateTime startDate = info.StartDate;
                        if (endDate.HasValue ? (endDate.GetValueOrDefault() > startDate) : false)
                        {
                            DateTime?nullable2 = info.EndDate;
                            builder.EndAt(nullable2.HasValue ? new DateTimeOffset?(nullable2.GetValueOrDefault()) : null);
                        }
                        ICronTrigger trigger  = (ICronTrigger)builder.Build();
                        DateTime     dateTime = scheduler.ScheduleJob(jobDetail, trigger).Result.DateTime;
                        info.NextDate = new DateTime?(TimeZoneInfo.ConvertTime(dateTime, trigger.TimeZone));
                    }
                }
            }
            scheduler.Start();
        }
示例#4
0
        public static TriggerBuilder Start_(this TriggerBuilder builder, DateTimeOffset?when = null)
        {
            var res = when == null?
                      builder.StartNow() :
                          builder.StartAt(when.Value);

            return(res);
        }
示例#5
0
 public static TriggerBuilder TriggerDuration(this TriggerBuilder builder,
                                              DateTimeOffset startTime,
                                              DateTimeOffset?endTime = null)
 {
     builder
     .StartAt(startTime)
     .EndAt(endTime);
     return(builder);
 }
示例#6
0
 /// <summary>
 /// 设置作业开始时间
 /// </summary>
 private void SetStartTime(TriggerBuilder builder, JobBase job)
 {
     if (job.GetStartTime() == null)
     {
         builder.StartNow();
         return;
     }
     builder.StartAt(job.GetStartTime().SafeValue());
 }
        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);
        }
示例#8
0
        /// <summary>
        /// 启动任务
        /// </summary>
        public void Start()
        {
            if (_tasks.Count() == 0)
            {
                return;
            }

            TaskService       taskService = new TaskService();
            ISchedulerFactory sf          = new StdSchedulerFactory();
            IScheduler        sched       = sf.GetScheduler();

            foreach (var task in _tasks)
            {
                if (!task.Enabled)
                {
                    continue;
                }

                Type type = Type.GetType(task.ClassType);
                if (type == null)
                {
                    continue;
                }

                string triggerName = type.Name + "_trigger";

                IJobDetail job = JobBuilder.Create(typeof(QuartzTask))
                                 .WithIdentity(type.Name)
                                 .Build();

                job.JobDataMap.Add(new KeyValuePair <string, object>("Id", task.Id));


                TriggerBuilder tb = TriggerBuilder.Create()
                                    .WithIdentity(triggerName)
                                    .WithCronSchedule(task.TaskRule);

                if (task.StartDate > DateTime.MinValue)
                {
                    tb.StartAt(new DateTimeOffset(task.StartDate));
                }

                if (task.EndDate > task.StartDate)
                {
                    tb.EndAt(task.EndDate);
                }

                ICronTrigger trigger = (ICronTrigger)tb.Build();
                DateTime     ft      = sched.ScheduleJob(job, trigger).DateTime;
                task.NextStart = TimeZoneInfo.ConvertTime(ft, trigger.TimeZone);
            }

            sched.Start();
        }
示例#9
0
        public void Update(TaskDetail task)
        {
            if (task == null)
            {
                return;
            }
            int index = _tasks.FindIndex((TaskDetail n) => n.Id == task.Id);

            if (_tasks[index] == null)
            {
                return;
            }
            task.ClassType     = _tasks[index].ClassType;
            task.LastEnd       = _tasks[index].LastEnd;
            task.LastStart     = _tasks[index].LastStart;
            task.LastIsSuccess = _tasks[index].LastIsSuccess;
            _tasks[index]      = task;
            Type type = Type.GetType(task.ClassType);

            if (type == null)
            {
                return;
            }
            Remove(type.Name);
            if (!task.Enabled)
            {
                return;
            }
            string            name             = type.Name + "_trigger";
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler        scheduler        = schedulerFactory.GetScheduler();
            IJobDetail        jobDetail        = JobBuilder.Create(typeof(QuartzTask)).WithIdentity(type.Name).Build();

            jobDetail.JobDataMap.Add(new KeyValuePair <string, object>("Id", task.Id));
            TriggerBuilder triggerBuilder = TriggerBuilder.Create().WithIdentity(name).WithCronSchedule(task.TaskRule);

            if (task.StartDate > DateTime.MinValue)
            {
                triggerBuilder.StartAt(new DateTimeOffset(task.StartDate));
            }
            if (task.EndDate.HasValue && task.EndDate > task.StartDate)
            {
                TriggerBuilder arg_233_0 = triggerBuilder;
                DateTime?      endDate   = task.EndDate;
                arg_233_0.EndAt(endDate.HasValue ? new DateTimeOffset?(endDate.GetValueOrDefault()) : null);
            }
            var      cronTrigger = (ICronTrigger)triggerBuilder.Build();
            DateTime dateTime    = scheduler.ScheduleJob(jobDetail, cronTrigger).DateTime;

            task.NextStart = TimeZoneInfo.ConvertTime(dateTime, cronTrigger.TimeZone);
        }
示例#10
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());
        }
示例#11
0
 /// <summary>
 /// 更新任务
 /// </summary>
 /// <param name="task"></param>
 public void Update(TaskInfo task)
 {
     if (task != null)
     {
         int num = tasks.FindIndex(n => n.Id == task.Id);
         if (tasks[num] != null)
         {
             task.TaskType      = tasks[num].TaskType;
             task.LastEndDate   = tasks[num].LastEndDate;
             task.LastStartDate = tasks[num].LastStartDate;
             task.LastSuccess   = tasks[num].LastSuccess;
             tasks[num]         = task;
             Type type = Type.GetType(task.TaskType);
             if (type != null)
             {
                 this.Remove(type.Name);
                 if (task.IsEnabled)
                 {
                     string            name      = type.Name + "_trigger";
                     ISchedulerFactory factory   = new StdSchedulerFactory();
                     IScheduler        scheduler = factory.GetScheduler().Result;
                     IJobDetail        jobDetail = JobBuilder.Create(typeof(QuartzTask)).WithIdentity(type.Name).Build();
                     jobDetail.JobDataMap.Add(new KeyValuePair <string, object>("Id", task.Id));
                     TriggerBuilder builder = TriggerBuilder.Create().WithIdentity(name).WithCronSchedule(task.TaskRule);
                     if (task.StartDate > DateTime.MinValue)
                     {
                         builder.StartAt(new DateTimeOffset(task.StartDate));
                     }
                     if (task.EndDate.HasValue)
                     {
                         DateTime?endDate   = task.EndDate;
                         DateTime startDate = task.StartDate;
                         if (endDate.HasValue ? (endDate.GetValueOrDefault() > startDate) : false)
                         {
                             DateTime?nullable3 = task.EndDate;
                             builder.EndAt(nullable3.HasValue ? new DateTimeOffset?(nullable3.GetValueOrDefault()) : null);
                         }
                     }
                     ICronTrigger trigger  = (ICronTrigger)builder.Build();
                     DateTime     dateTime = scheduler.ScheduleJob(jobDetail, trigger).Result.DateTime;
                     task.NextDate = new DateTime?(TimeZoneInfo.ConvertTime(dateTime, trigger.TimeZone));
                 }
             }
         }
     }
 }
示例#12
0
        /// <summary>
        /// 创建CronTrigger
        /// </summary>
        /// <returns></returns>
        public static ICronTrigger CreateCronTrigger(TriggerItem triggerItem)
        {
            TriggerBuilder triggerBuilder = TriggerBuilder.Create();

            if (!string.IsNullOrEmpty(triggerItem.StartTime))
            {
                triggerBuilder = triggerBuilder.StartAt(Convert.ToDateTime(triggerItem.StartTime));
            }
            if (!string.IsNullOrEmpty(triggerItem.EndTime))
            {
                triggerBuilder = triggerBuilder.EndAt(Convert.ToDateTime(triggerItem.EndTime));
            }
            triggerBuilder = triggerBuilder.WithCronSchedule(triggerItem.CronExpression);
            ICronTrigger trigger = (ICronTrigger)triggerBuilder
                                   .WithCronSchedule(triggerItem.CronExpression)
                                   .WithIdentity(triggerItem.Name, triggerItem.Group)
                                   .Build();

            return(trigger);
        }
示例#13
0
        /// <summary>
        /// 创建cronExpression trigger
        /// </summary>
        /// <param name="code">唯一编码</param>
        /// <param name="group">组名</param>
        /// <param name="cronExpression">周期表达式</param>
        /// <param name="startNow">是否立刻启动</param>
        /// <param name="timeOffset">多少时间后启动</param>
        /// <returns></returns>
        private static ITrigger CreateTrigger(string code, string group, string cronExpression, bool startNow, DateTimeOffset timeOffset)
        {
            TriggerBuilder triggerBuilder = TriggerBuilder.Create()
                                            .WithIdentity(GetTriggerIdentityName(code), GetTriggerIdentifyGroup(group))
                                            // 运行模式
                                            .WithCronSchedule(cronExpression);

            if (startNow)
            {
                triggerBuilder.StartNow();
            }
            else
            {
                if (timeOffset != null)
                {
                    triggerBuilder.StartAt(timeOffset);
                }
            }

            return(triggerBuilder.Build());
        }
示例#14
0
        public void Start()
        {
            if (_tasks.Count() == 0)
            {
                return;
            }
            new TaskService();
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler        scheduler        = schedulerFactory.GetScheduler();

            foreach (TaskDetail current in _tasks)
            {
                if (current.Enabled)
                {
                    Type type = Type.GetType(current.ClassType);
                    if (!(type == null))
                    {
                        string     name      = type.Name + "_trigger";
                        IJobDetail jobDetail = JobBuilder.Create(typeof(QuartzTask)).WithIdentity(type.Name).Build();
                        jobDetail.JobDataMap.Add(new KeyValuePair <string, object>("Id", current.Id));
                        TriggerBuilder triggerBuilder =
                            TriggerBuilder.Create().WithIdentity(name).WithCronSchedule(current.TaskRule);
                        if (current.StartDate > DateTime.MinValue)
                        {
                            triggerBuilder.StartAt(new DateTimeOffset(current.StartDate));
                        }
                        if (current.EndDate > current.StartDate)
                        {
                            TriggerBuilder arg_14A_0 = triggerBuilder;
                            DateTime?      endDate   = current.EndDate;
                            arg_14A_0.EndAt(endDate.HasValue ? new DateTimeOffset?(endDate.GetValueOrDefault()) : null);
                        }
                        var      cronTrigger = (ICronTrigger)triggerBuilder.Build();
                        DateTime dateTime    = scheduler.ScheduleJob(jobDetail, cronTrigger).DateTime;
                        current.NextStart = TimeZoneInfo.ConvertTime(dateTime, cronTrigger.TimeZone);
                    }
                }
            }
            scheduler.Start();
        }
        private ITrigger CreateTrigger(ScriptAbs script)
        {
            TriggerBuilder triggerBuilder = TriggerBuilder
                                            .Create()
                                            .WithIdentity(GetTriggerKeyForScript(script));

            if (script is ScriptScheduled scriptScheduled)
            {
                triggerBuilder
                .StartAt(GetTriggerStartAt(scriptScheduled.ScheduledHour))
                .WithSimpleSchedule(x => x
                                    .WithIntervalInHours(24)
                                    .RepeatForever()
                                    );
            }
            else
            {
                triggerBuilder.StartNow();
            }

            return(triggerBuilder.Build());
        }
示例#16
0
        public static async void AddTaskTriggerForJob(Models.Task task, User user)
        {
            try
            {
                TriggerBuilder triggerBuilder = TriggerBuilder.Create()
                                                .WithIdentity(task.Id.ToString())
                                                .WithCronSchedule(task.Period);
                if (DateTime.Now >= DateTime.Parse(task.StartTime))
                {
                    triggerBuilder.StartNow();
                }
                else
                {
                    triggerBuilder.StartAt(DateTimeOffset.Parse(task.StartTime));
                }

                ITrigger trigger = null;
                if (task.ApiId == (int)APIID.COVID) // создание триггеров на задачи по получанию данных covid
                {
                    trigger = triggerBuilder.ForJob(covidJobName).Build();
                }
                else if (task.ApiId == (int)APIID.FOREX) // создание триггеров на задачи по получанию данных forex
                {
                    trigger = triggerBuilder.ForJob(forexJobName).Build();
                }
                else if (task.ApiId == (int)APIID.QUOTE) // создание триггеров на задачи по получанию данных quote
                {
                    trigger = triggerBuilder.ForJob(quoteJobName).Build();
                }
                trigger.JobDataMap["apiParam"] = task.ApiParam;
                trigger.JobDataMap["idTask"]   = task.Id;
                trigger.JobDataMap["userMail"] = user.Email;
                await scheduler.ScheduleJob(trigger);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
            }
        }
示例#17
0
        public async Task <DateTimeOffset?> TriggerSendUnsentEventsJob(DateTime?startAt)
        {
            ValidateSendUnsentJobSchedule();
            TriggerBuilder builder = TriggerBuilder.Create()
                                     .WithIdentity(nameof(SendUnsentEventsJob) + Guid.NewGuid().ToString(), Constants.Group.General);

            if (startAt != null)
            {
                builder = builder.StartAt(startAt.Value);
            }
            else
            {
                builder = builder.StartNow();
            }
            var trigger    = builder.ForJob(SendUnsentEventsJobKey).Build();
            var oldTrigger = await Scheduler.GetTrigger(SendUnsentEventsJobTriggerKey);

            if (oldTrigger != null)
            {
                return(await Scheduler.RescheduleJob(SendUnsentEventsJobTriggerKey, trigger));
            }
            return(await Scheduler.ScheduleJob(trigger));
        }
示例#18
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);
        }
示例#19
0
        private static async void AddJob(IScheduler scheduler, TimeSpan intervalTs, DateTime?startAt, int?repeatCount, string groupName, string triggerName, IJobDetail job)
        {
            TriggerBuilder triggerBuilder = null;

            if (repeatCount.HasValue)
            {
                repeatCount -= 1;

                triggerBuilder = TriggerBuilder.Create()
                                 .WithIdentity(triggerName, groupName)
                                 .StartNow()
                                 .WithSimpleSchedule(x => x
                                                     .WithInterval(intervalTs)
                                                     .WithRepeatCount(repeatCount.Value));
            }
            else
            {
                triggerBuilder = TriggerBuilder.Create()
                                 .WithIdentity(triggerName, groupName)
                                 .StartNow()
                                 .WithSimpleSchedule(x => x
                                                     .WithInterval(intervalTs)
                                                     .RepeatForever());
            }

            if (!startAt.HasValue)
            {
                startAt = DateTime.Now + TimeSpan.FromSeconds(10);
            }

            triggerBuilder.StartAt(startAt.Value);

            ITrigger trigger = triggerBuilder.Build();

            await scheduler.ScheduleJob(job, trigger);
        }
        /// <summary>
        /// Handles with a given text matches the Expression4 field.
        /// </summary>
        /// <param name="nameValueCollection">A collection of values from the named capture groups.</param>
        /// <param name="results">The results.</param>
        private void Expression4Handler(NameValueCollection nameValueCollection, TimeZoneInfo timeZone, TextToScheduleResults results)
        {
            // every [n] (days|weeks|months|years) (from [date]) (at [time])

            string amountString   = nameValueCollection["AMOUNT"];
            string intervalString = nameValueCollection["INTERVALUNIT"];

            var dateSpec       = nameValueCollection["DATESPEC"];
            var dayOfWeekSpecs = nameValueCollection.GetValues("DAYOFWEEK");
            var timesToFire    = nameValueCollection.GetValues("TIME");

            DateTime?triggerStartTime = null;

            if (dayOfWeekSpecs != null && GrammarHelper.GetIntervalUnitValueFromString(intervalString) != IntervalUnit.Week)
            {
                throw new Exception("You should only specify a day of the week, when you are using the \"week\" time interval.");
            }

            if (timesToFire == null) // if times are not specified assume midnight
            {
                timesToFire = new string[] { "00:00" }
            }
            ;

            foreach (var timeString in timesToFire)
            {
                if (dateSpec != null || timeString != null)
                {
                    triggerStartTime = GrammarHelper.GetDateTimeFromDateSpecAndTime(dateSpec, timeString);
                }

                if (dayOfWeekSpecs != null)
                {
                    var dayOfWeeks = GrammarHelper.GetDayOfWeekValues(dayOfWeekSpecs);
                    foreach (var dayOfWeek in dayOfWeeks)
                    {
                        if (triggerStartTime == null)
                        {
                            triggerStartTime = SystemTime.Now().DateTime;
                        }

                        DateTime dowTriggerStartTime = triggerStartTime.Value;
                        //seek
                        dowTriggerStartTime = SeekForwardToNextDayOfWeek(dowTriggerStartTime, dayOfWeek);

                        TriggerBuilder triggerBuilder = TriggerBuilder.Create();
                        triggerBuilder.WithSchedule(CreateScheduleWithAmountAndIntervalUnit(amountString, intervalString, timeZone));
                        triggerBuilder.StartAt(new DateTimeOffset(dowTriggerStartTime, timeZone.GetUtcOffset(dowTriggerStartTime)));

                        results.Add(triggerBuilder, null);
                    }
                }
                else
                {
                    TriggerBuilder triggerBuilder = TriggerBuilder.Create();
                    triggerBuilder.WithSchedule(CreateScheduleWithAmountAndIntervalUnit(amountString, intervalString, timeZone));

                    //start on from time
                    if (triggerStartTime != null)
                    {
                        triggerBuilder.StartAt(new DateTimeOffset(triggerStartTime.Value, timeZone.GetUtcOffset(triggerStartTime.Value)));
                    }

                    results.Add(triggerBuilder, null);
                }
            }
        }
示例#21
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);
                }
            }
        }
示例#22
0
        /// <summary>
        /// 开始任务
        /// </summary>
        public void Start()
        {
            var taskService = DIContainer.Resolve <IQuartzTaskService>();

            if (_tasks == null)
            {
                _tasks = taskService.QuartzTasks.ToList();
            }

            if (_tasks.Count == 0)
            {
                return;
            }

            var taskScheduler = DIContainer.Resolve <ITaskScheduler>();

            foreach (var task in _tasks)
            {
                if (!task.Enabled)
                {
                    continue;
                }

                Type type = Type.GetType(task.ClassType);
                if (type == null)
                {
                    continue;
                }

                string triggerName = type.Name + "_trigger";

                IJobDetail job = JobBuilder.Create(typeof(JobDetail))
                                 .WithIdentity(type.Name)
                                 .Build();

                job.JobDataMap.Add(new KeyValuePair <string, object>("Id", task.Id));


                TriggerBuilder tb = TriggerBuilder.Create()
                                    .WithIdentity(triggerName)
                                    .WithCronSchedule(task.TaskRule);

                if (task.NextStart.HasValue)
                {
                    tb.StartAt(new DateTimeOffset(task.NextStart.Value));
                }
                else if (task.StartDate > DateTime.MinValue)
                {
                    tb.StartAt(new DateTimeOffset(task.StartDate));
                }

                if (task.EndDate > task.StartDate)
                {
                    tb.EndAt(task.EndDate);
                }

                ICronTrigger trigger   = (ICronTrigger)tb.Build();
                DateTime     nextStart = sched.ScheduleJob(job, trigger).LocalDateTime;

                if (task.NextStart == null || task.NextStart < nextStart)
                {
                    task.NextStart = nextStart;
                    taskScheduler.SaveTaskStatus(task);
                }
            }

            sched.Start();
        }
示例#23
0
 private TriggerBuilder AddOneTime(TriggerBuilder triggerBuilder, ScheduleModel scheduler)
 {
     return(triggerBuilder.StartAt(scheduler.StarTime));
 }
示例#24
0
        /// <summary>
        /// 执行JOB 用于检查Job_Info表
        /// </summary>
        /// <param name="context"></param>
        public void Execute(IJobExecutionContext context)
        {
            Log4NetHelper.Info("开始获取JobInfo", logger: logger);
            try
            {
                List <Job_Info> jobList = new JobInfoBLL().GetJobList();
                if (jobList != null && jobList.Count > 0)
                {
                    JobKey jobKey = null;
                    foreach (var jobinfo in jobList)
                    {
                        jobKey = new JobKey(jobinfo.Job_name + JobConfig.JOBKEY_NAMEEND, "group1");
                        //只有正常执行状态的Job才添加到调度器中
                        if (!JobConfig.scheduler.CheckExists(jobKey) && jobinfo.Job_state == 0)
                        {
                            IJobDetail job = JobBuilder.Create <RunTaskDLLJob>().WithIdentity(jobKey).Build();

                            //创建触发器
                            TriggerBuilder tb = TriggerBuilder.Create()
                                                .WithIdentity(jobinfo.Job_name + JobConfig.JOBTRIGGER_NAMEEND, "group1");
                            if (!string.IsNullOrEmpty(jobinfo.Job_corn))
                            {
                                tb.WithCronSchedule(jobinfo.Job_corn); //执行corn表达式
                            }
                            if (jobinfo.Job_execount > 0)              //如果执行固定的次数
                            {
                                tb.WithSimpleSchedule(a => a.WithRepeatCount(jobinfo.Job_execount));
                            }

                            if (jobinfo.Job_starttime != null && jobinfo.Job_starttime > DateTime.Now)//设置Job启动时间
                            {
                                tb.StartAt(jobinfo.Job_starttime);
                            }
                            else
                            {
                                tb.StartNow();
                            }

                            ITrigger trigger = tb.Build();
                            //传递参数
                            job.JobDataMap.Add(jobKey.Name, jobinfo.Id);

                            JobConfig.scheduler.ScheduleJob(job, trigger);

                            Log4NetHelper.Info(string.Format("加入Job:{0}成功", jobKey.Name), logger: logger);
                        }
                        else if (JobConfig.scheduler.CheckExists(jobKey))
                        {
                            if (jobinfo.Job_state == 2 || jobinfo.Job_state == 3)
                            {
                                JobConfig.scheduler.PauseJob(jobKey);
                                Log4NetHelper.Info(string.Format("暂停Job:{0}成功", jobKey.Name), logger: logger);
                            }
                            else if (jobinfo.Job_state == 4)
                            {
                                JobConfig.scheduler.DeleteJob(jobKey);
                                Log4NetHelper.Info(string.Format("删除Job:{0}成功", jobKey.Name), logger: logger);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log4NetHelper.Info(string.Format("LoopJob异常:{0},{1},{2}", ex.Message, ex.InnerException, ex.StackTrace), logger: logger);
            }
            Log4NetHelper.Info("结束获取JobInfo", logger: logger);
        }
示例#25
0
        /// <summary>
        /// 更新任务
        /// </summary>
        /// <param name="task"></param>
        public void Update(QuartzTask task)
        {
            if (task == null)
            {
                return;
            }

            int index = _tasks.FindIndex(n => n.Id == task.Id);

            if (_tasks[index] == null)
            {
                return;
            }

            task.ClassType     = _tasks[index].ClassType;
            task.LastEnd       = _tasks[index].LastEnd;
            task.LastStart     = _tasks[index].LastStart;
            task.LastIsSuccess = _tasks[index].LastIsSuccess;

            _tasks[index] = task;

            Type type = Type.GetType(task.ClassType);

            if (type == null)
            {
                return;
            }

            Remove(type.Name);

            if (!task.Enabled)
            {
                return;
            }

            string triggerName = type.Name + "_trigger";

            IJobDetail job = JobBuilder.Create(typeof(JobDetail))
                             .WithIdentity(type.Name)
                             .Build();

            job.JobDataMap.Add(new KeyValuePair <string, object>("Id", task.Id));


            TriggerBuilder tb = TriggerBuilder.Create()
                                .WithIdentity(triggerName)
                                .WithCronSchedule(task.TaskRule);

            if (task.NextStart.HasValue)
            {
                tb.StartAt(new DateTimeOffset(task.NextStart.Value));
            }
            else if (task.StartDate > DateTime.MinValue)
            {
                tb.StartAt(new DateTimeOffset(task.StartDate));
            }

            if (task.EndDate.HasValue && task.EndDate > task.StartDate)
            {
                tb.EndAt(task.EndDate);
            }

            ICronTrigger trigger = (ICronTrigger)tb.Build();

            DateTime nextStart = sched.ScheduleJob(job, trigger).LocalDateTime;

            if (task.NextStart.HasValue && task.NextStart < nextStart)
            {
                task.NextStart = nextStart;
            }
        }
示例#26
0
 public TriggerHelper StartAt(DateTimeOffset startTimeUtc)
 {
     trigger.StartAt(startTimeUtc);
     return(this);
 }
示例#27
0
        private void scheduleTask(ScheduledTask task)
        {
            if (!string.IsNullOrEmpty(task.ServerName) && task.ServerName.ToLower(CultureInfo.GetCultureInfo("en-US")) != System.Environment.MachineName.ToLower(CultureInfo.GetCultureInfo("en-US")))
            {
                return;
            }
            JobKey jobKey = new JobKey(task.Name);

            if (!task.Enabled)
            {
                if (_scheduler.CheckExists(jobKey))
                {
                    _scheduler.DeleteJob(jobKey);
                }
                return;
            }
            TriggerKey     triggerkey     = new TriggerKey(string.Format("{0}_trigger", task.Name));
            TriggerBuilder triggerBuilder = null;

            if (!_scheduler.CheckExists(triggerkey))
            {
                triggerBuilder = TriggerBuilder.Create().WithIdentity(triggerkey);
            }
            else
            {
                ICronTrigger oldTrigger = (ICronTrigger)_scheduler.GetTrigger(triggerkey);
                if (oldTrigger.CronExpressionString == task.CronExpression)
                {
                    return;
                }
                triggerBuilder = oldTrigger.GetTriggerBuilder();
            }

            TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(PxConfigurationManager.PxConfig.Schedule.TimeZoneId);

            switch (task.MissedScheduleAction)
            {
            case MissedScheduleActionType.RunLatest:
                triggerBuilder = triggerBuilder.WithCronSchedule(task.CronExpression, x => x.InTimeZone(timeZoneInfo).WithMisfireHandlingInstructionFireAndProceed());
                break;

            case MissedScheduleActionType.RunAll:
                triggerBuilder = triggerBuilder.WithCronSchedule(task.CronExpression, x => x.InTimeZone(timeZoneInfo).WithMisfireHandlingInstructionIgnoreMisfires());
                break;

            case MissedScheduleActionType.NoAction:
            default:
                triggerBuilder = triggerBuilder.WithCronSchedule(task.CronExpression, x => x.InTimeZone(timeZoneInfo).WithMisfireHandlingInstructionDoNothing());
                break;
            }

            if (task.StartDate != null && (DateTime)task.StartDate != DateTime.MinValue)
            {
                triggerBuilder = triggerBuilder.StartAt(new DateTimeOffset(task.StartDate.Value));
            }
            else
            {
                triggerBuilder = triggerBuilder.StartAt(new DateTimeOffset(DateTime.Now));
            }
            if (task.EndDate != null && (DateTime)task.EndDate != DateTime.MinValue)
            {
                triggerBuilder = triggerBuilder.EndAt(new DateTimeOffset((DateTime)task.EndDate));
            }

            IJobDetail job = JobBuilder.Create <PxScheduledTask>().WithIdentity(jobKey).RequestRecovery().Build();

            job.JobDataMap.Put("ScheduledTask", task);
            ICronTrigger trigger = (ICronTrigger)triggerBuilder.ForJob(job).Build();

            if (!_scheduler.CheckExists(triggerkey))
            {
                _scheduler.ScheduleJob(job, trigger);
            }
            else
            {
                _scheduler.RescheduleJob(triggerkey, trigger);
            }
        }
        /// <summary>
        /// Handles with a given text matches the Expression1 field.
        /// </summary>
        /// <param name="nameValueCollection">A collection of values from the named capture groups.</param>
        /// <param name="results">The results.</param>
        private void Expression1Handler(NameValueCollection nameValueCollection, TimeZoneInfo timeZone, TextToScheduleResults results)
        {
            var amountString       = nameValueCollection["AMOUNT"];
            var intervalUnitString = nameValueCollection["INTERVALUNIT"];
            var startDateString    = nameValueCollection["DATESPEC"];

            var time     = nameValueCollection["TIME"];
            var fromTime = nameValueCollection["FROMTIME"];
            var toTime   = nameValueCollection["TOTIME"];

            var dayOfWeekSpecs = nameValueCollection.GetValues("DAYOFWEEK");
            var monthSpecs     = nameValueCollection.GetValues("MONTH");

            DateTime?triggerStartTime = null;

            ICalendar calendar = null;

            //DAY OF WEEK SPECS
            if (dayOfWeekSpecs != null)
            {
                calendar = BuildCalendarOnDayOfWeek(calendar, dayOfWeekSpecs, timeZone);
            }

            //MONTH SPECS
            if (monthSpecs != null)
            {
                calendar = BuildCalendarOnMonths(calendar, monthSpecs, timeZone);
            }


            //TIME (single or range)

            //check for ranged time
            if (fromTime != null && toTime != null)
            {
                calendar = BuildCalendarOnTimeRange(calendar, fromTime, toTime, timeZone);

                //set the start date as the from time
                DateTime?fromTimeStartDate = GrammarHelper.GetTimeFromTimeString(fromTime);
                triggerStartTime = fromTimeStartDate;
            }
            //is regular time, process as single time provided
            else if (time != null)
            {
                DateTime?timeStartDate = GrammarHelper.GetTimeFromTimeString(time);
                triggerStartTime = timeStartDate;
            }

            //BUILD TRIGGER
            TriggerBuilder triggerBuilder = TriggerBuilder.Create();

            //set schedule
            triggerBuilder.WithSchedule(CreateScheduleWithAmountAndIntervalUnit(amountString, intervalUnitString, timeZone));


            //start on from time
            if (triggerStartTime != null)
            {
                triggerBuilder.StartAt(new DateTimeOffset(triggerStartTime.Value, timeZone.GetUtcOffset(triggerStartTime.Value)));
            }

            results.Add(triggerBuilder, calendar);
        }
示例#29
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);
        }
示例#30
0
        /// <summary>
        /// 初始化并启动
        /// </summary>
        public void Startup()
        {
            Task.Run(async() => {
                NameValueCollection props = new NameValueCollection
                {
                    { "quartz.serializer.type", "binary" }
                };
                _factory   = new StdSchedulerFactory(props);
                _scheduler = await _factory.GetScheduler();
                _scheduler.Context.Add("IServiceProvider", _provider);
                await _scheduler.Start();

                //读取数据库中所有定时任务
                var tasks = await _service.GetListAsync(new Domain.Entity.System.TimedTaskSearch {
                    IsDeleted = false
                }, null);

                //加载程序集
                assemblies = tasks.Select(x => x.AssemblyName).Distinct().Select(name => AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(name))).ToList();

                foreach (var task in tasks.Where(x => x.Status != Domain.Enum.System.EmTimedTaskStatus.Disable && x.Status != Domain.Enum.System.EmTimedTaskStatus.Expired))
                {
                    //处理过期任务
                    if (task.ValidEndTime < DateTime.Now)
                    {
                        await _service.UpdateTaskStatusAsync(task.Id, new {
                            Status = Domain.Enum.System.EmTimedTaskStatus.Expired
                        });
                        continue;
                    }

                    var assembly = assemblies.FirstOrDefault(x => x.FullName.Split(',')[0].Equals(task.AssemblyName));
                    if (assembly == null)
                    {
                        //未正确加载程序集
                        await _service.UpdateTaskStatusAsync(task.Id, new
                        {
                            Status = Domain.Enum.System.EmTimedTaskStatus.Abnormal
                        });
                        continue;
                    }

                    var type = assembly.DefinedTypes.FirstOrDefault(x => x.FullName.Equals(task.TypeName));
                    if (type == null)
                    {
                        //未正确加载类型
                        await _service.UpdateTaskStatusAsync(task.Id, new
                        {
                            Status = Domain.Enum.System.EmTimedTaskStatus.Abnormal
                        });
                        continue;
                    }

                    // 定义一个 Job
                    IJobDetail job = JobBuilder.Create(type)
                                     .WithIdentity(task.Name, task.Group)
                                     .UsingJobData("TaskId", task.Id)
                                     .Build();

                    // 定义一个触发器
                    TriggerBuilder builder = TriggerBuilder.Create().WithIdentity(task.Name, task.Group);
                    if (task.ValidStartTime <= DateTime.Now)
                    {
                        builder = builder.StartNow();
                    }
                    else
                    {
                        builder = builder.StartAt(task.ValidStartTime);
                    }
                    builder = builder.EndAt(task.ValidEndTime);

                    //Cron
                    builder = builder.WithCronSchedule(task.Cron);

                    ITrigger trigger = builder.Build();

                    //加入Job
                    await _scheduler.ScheduleJob(job, trigger);
                }
            });
        }