Example #1
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);
            }
        }