示例#1
0
        /// <summary>
        /// Schedule specified trigger
        /// </summary>
        /// <param name="myTrigger"></param>
        public Guid ScheduleTrigger(BaseTrigger myTrigger)
        {
            Guid triggerId = Guid.Empty;

            // Set default values
            DateTimeOffset startAt = (DateTime.MinValue != myTrigger.StartDateTime) ? myTrigger.StartDateTime : DateTime.Now;

            // Set default trigger group
            myTrigger.Group = (!string.IsNullOrEmpty(myTrigger.Group)) ? myTrigger.Group : TriggerKey.DefaultGroup;

            // Check if jobDetail already exists
            var jobKey = new JobKey(myTrigger.JobName, myTrigger.JobGroup);

            // If jobDetail does not exist, throw
            if (!_scheduler.CheckExists(jobKey))
            {
                throw new Exception(string.Format("Job does not exist. Name = {0}, Group = {1}", myTrigger.CalendarName, myTrigger.JobGroup));
            }

            IJobDetail jobDetail = _scheduler.GetJobDetail(jobKey);

            var jobDataMap = new JobDataMap();

            if (myTrigger.JobDataMap != null && myTrigger.JobDataMap.Count > 0)
            {
                foreach (var jobData in myTrigger.JobDataMap)
                {
                    jobDataMap.Add(jobData.Key, jobData.Value);
                }
            }

            var cronTrigger = myTrigger as CronTrigger;

            if (cronTrigger != null)
            {
                //SmartPolicy
                Action <CronScheduleBuilder> misFireAction = x => {};

                switch (cronTrigger.MisfireInstruction)
                {
                case MisfireInstructionCron.DoNothing:
                    misFireAction = builder => builder.WithMisfireHandlingInstructionDoNothing();
                    break;

                case MisfireInstructionCron.FireOnceNow:
                    misFireAction = builder => builder.WithMisfireHandlingInstructionFireAndProceed();
                    break;

                case MisfireInstructionCron.Ignore:
                    misFireAction = builder => builder.WithMisfireHandlingInstructionIgnoreMisfires();
                    break;
                }

                var trigger = (ICronTrigger)TriggerBuilder.Create()
                              .WithIdentity(myTrigger.Name, myTrigger.Group)
                              .ForJob(jobDetail)
                              .UsingJobData(jobDataMap)
                              .ModifiedByCalendar(!string.IsNullOrEmpty(cronTrigger.CalendarName) ? cronTrigger.CalendarName : null)
                              .WithCronSchedule(cronTrigger.CronExpression, misFireAction)
                              .StartAt(startAt)
                              .Build();

                trigger.TimeZone = TimeZoneInfo.Local;

                using (var tran = new TransactionScope())
                {
                    triggerId = _persistanceStore.UpsertTriggerKeyIdMap(myTrigger.Name, myTrigger.Group);
                    _scheduler.ScheduleJob(trigger);
                    tran.Complete();
                }
            }

            var simpleTrigger = myTrigger as SimpleTrigger;

            if (simpleTrigger != null)
            {
                //SmartPolicy
                Action <SimpleScheduleBuilder> misFireAction = x => x.WithInterval(simpleTrigger.RepeatInterval)
                                                               .WithRepeatCount(simpleTrigger.RepeatCount);

                switch (simpleTrigger.MisfireInstruction)
                {
                case MisfireInstructionSimple.FireNow:
                    misFireAction = builder => builder.WithInterval(simpleTrigger.RepeatInterval)
                                    .WithRepeatCount(simpleTrigger.RepeatCount).WithMisfireHandlingInstructionFireNow();
                    break;

                case MisfireInstructionSimple.Ignore:
                    misFireAction = builder => builder.WithInterval(simpleTrigger.RepeatInterval)
                                    .WithRepeatCount(simpleTrigger.RepeatCount).WithMisfireHandlingInstructionIgnoreMisfires();
                    break;

                case MisfireInstructionSimple.RescheduleNextWithExistingCount:
                    misFireAction = builder => builder.WithInterval(simpleTrigger.RepeatInterval)
                                    .WithRepeatCount(simpleTrigger.RepeatCount).WithMisfireHandlingInstructionNextWithExistingCount();
                    break;

                case MisfireInstructionSimple.RescheduleNextWithRemainingCount:
                    misFireAction = builder => builder.WithInterval(simpleTrigger.RepeatInterval)
                                    .WithRepeatCount(simpleTrigger.RepeatCount).WithMisfireHandlingInstructionNextWithRemainingCount();
                    break;

                case MisfireInstructionSimple.RescheduleNowWithExistingRepeatCount:
                    misFireAction = builder => builder.WithInterval(simpleTrigger.RepeatInterval)
                                    .WithRepeatCount(simpleTrigger.RepeatCount).WithMisfireHandlingInstructionNowWithExistingCount();
                    break;

                case MisfireInstructionSimple.RescheduleNowWithRemainingRepeatCount:
                    misFireAction = builder => builder.WithInterval(simpleTrigger.RepeatInterval)
                                    .WithRepeatCount(simpleTrigger.RepeatCount).WithMisfireHandlingInstructionNowWithRemainingCount();
                    break;
                }

                var trigger = (ISimpleTrigger)TriggerBuilder.Create()
                              .WithIdentity(myTrigger.Name, myTrigger.Group)
                              .ForJob(jobDetail)
                              .UsingJobData(jobDataMap)
                              .ModifiedByCalendar(!string.IsNullOrEmpty(simpleTrigger.CalendarName) ? simpleTrigger.CalendarName : null)
                              .StartAt(startAt)
                              .WithSimpleSchedule(misFireAction)
                              .Build();

                using (var tran = new TransactionScope())
                {
                    triggerId = _persistanceStore.UpsertTriggerKeyIdMap(myTrigger.Name, myTrigger.Group);
                    _scheduler.ScheduleJob(trigger);
                    tran.Complete();
                }
            }

            return(triggerId);
        }