/// <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 ArgumentException(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 = _persistenceStore.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 = _persistenceStore.UpsertTriggerKeyIdMap(myTrigger.Name, myTrigger.Group); _scheduler.ScheduleJob(trigger); tran.Complete(); } } return(triggerId); }