public DailyCalendarDto(DailyCalendar calendar) : base(calendar) { InvertTimeRange = calendar.InvertTimeRange; TimeZone = new TimeZoneDto(calendar.TimeZone); }
private ICalendar parseDailyCalendar(XElement calendarXml) { DailyCalendar calendar = new DailyCalendar(parseRangeStartingTime(calendarXml), parseRangeEndingTime(calendarXml)); return(calendar); }
public DailyCalendarDto(DailyCalendar calendar, string calendarName) : base(calendar, calendarName) { InvertTimeRange = calendar.InvertTimeRange; TimeZone = new TimeZoneDto(calendar.TimeZone); }
public void CreateTrigger(string jobName, string jobGroup, string processName, string solutionName, string userName, string schedulerName) { var scheduler = AppScheduler.GetSchedulerOrDefault(schedulerName); AppScheduler.RemoveJob(jobName, jobGroup, scheduler); IJobDetail job = AppScheduler.CreateProcessJob(jobName, jobGroup, processName, solutionName, userName); AbstractTrigger trigger = null; string triggerName = jobName + "Trigger"; string triggerGroup = jobGroup; TimeSpan dailyFrom = _periodicity.CustomFrom.TimeOfDay; TimeSpan dailyTill = _periodicity.CustomTill.TimeOfDay; DateTime schedulerStart = _periodicity.SchedulerStart; TimeSpan schedulerStartTime = schedulerStart.TimeOfDay; DateTime? schedulerFinish = null; bool isSchedulerEndless = _periodicity.IsSchedulerEndless; if (!isSchedulerEndless) { schedulerFinish = _periodicity.SchedulerFinish; } _periodicity.IsDaily = true; // (Temporary for beta-version) bool isOncePerDay = _periodicity.IsOnce; bool isManyTimesPerDay = _periodicity.IsCustom; const string cronAll = "*"; const string cronLast = "L"; const string cronNoSpecific = "?"; TimeSpan syncTime = _periodicity.OnceAt.TimeOfDay; TimeSpan repeatInterval = TimeSpan.Zero; if (isOncePerDay) { if (schedulerStartTime > syncTime) { DateTime schedulerStartNextDay = schedulerStart.AddDays(1); schedulerStart = new DateTime(schedulerStartNextDay.Year, schedulerStartNextDay.Month, schedulerStartNextDay.Day, syncTime.Hours, syncTime.Minutes, syncTime.Seconds); } } else if (isManyTimesPerDay) { if (schedulerStartTime > dailyFrom) { DateTime schedulerStartNextDay = schedulerStart.AddDays(1); schedulerStart = new DateTime(schedulerStartNextDay.Year, schedulerStartNextDay.Month, schedulerStartNextDay.Day, dailyFrom.Hours, dailyFrom.Minutes, dailyFrom.Seconds); } var customPeriodType = (HoursOrMinutes)_periodicity.CustomPeriodType; int periodCount = _periodicity.CustomPeriod; if (customPeriodType == HoursOrMinutes.Hours) { repeatInterval = new TimeSpan(0, periodCount, 0, 0); } else if (customPeriodType == HoursOrMinutes.Minutes) { repeatInterval = new TimeSpan(0, 0, periodCount, 0); } else { throw new ArgumentException("Custom interval type is invalid"); } } int repeatToEndOfDateInterval = int.MaxValue; DailyCalendar dailyCalendar = null; const string calendarName = "FromTillPeriodicityDailyCalendar"; if (isManyTimesPerDay) { bool calendarAlreadyExists = false; foreach (var name in scheduler.GetCalendarNames()) { if (name == calendarName) { calendarAlreadyExists = true; break; } } if (!calendarAlreadyExists) { //dailyCalendar = new DailyCalendar(dailyFrom.ToString("c"), dailyTill.ToString("c")); dailyCalendar = new DailyCalendar(_periodicity.CustomFrom.TimeOfDay.ToString("c"), _periodicity.CustomTill.TimeOfDay.ToString("c")); dailyCalendar.TimeZone = _userConnection.CurrentUser.TimeZone; scheduler.AddCalendar(calendarName, dailyCalendar, false, false); } } if (_periodicity.IsDaily) { int daysCount = 1; // Temporary for beta-version. Must be: //int daysCount = _periodicity.DailyPeriod; if (isOncePerDay) { trigger = new SimpleTriggerImpl(triggerName, triggerGroup, schedulerStart, schedulerFinish, repeatToEndOfDateInterval, new TimeSpan(daysCount, 0, 0, 0)); } else if (isManyTimesPerDay) { if (daysCount == 1) { trigger = new SimpleTriggerImpl(triggerName, triggerGroup, schedulerStart, schedulerFinish, repeatToEndOfDateInterval, repeatInterval); trigger.CalendarName = calendarName; } else { var multiTrigger = new List <SimpleTriggerImpl>(); DateTime currDate = schedulerStart; DateTime stopDate = isSchedulerEndless ? currDate.AddYears(5) : schedulerFinish.Value; while (currDate <= stopDate) { var currDateEnd = new DateTime(currDate.Year, currDate.Month, currDate.Day, dailyTill.Hours, dailyTill.Minutes, dailyTill.Seconds); if (currDateEnd > stopDate) { currDateEnd = stopDate; } var multiTriggerPart = new SimpleTriggerImpl(triggerName, triggerGroup, currDate, currDateEnd, repeatToEndOfDateInterval, repeatInterval); multiTriggerPart.CalendarName = calendarName; multiTrigger.Add(multiTriggerPart); if (currDate == schedulerStart) // is first? // Set TimeSpan from dailyFrom: { currDate = new DateTime(currDate.Year, currDate.Month, currDate.Day, dailyFrom.Hours, dailyFrom.Minutes, dailyFrom.Seconds); } currDate.AddDays(daysCount); } foreach (var multiTriggerPart in multiTrigger) { multiTriggerPart.MisfireInstruction = MisfireInstruction.SimpleTrigger.FireNow; scheduler.ScheduleJob(job, trigger); } } } } else if (_periodicity.IsWeekly) { if (isOncePerDay) { string cronDayOfWeek = (_periodicity.DayOfWeek + 1).ToString(); string cronExpression = GetCronExpression(syncTime, cronNoSpecific, cronAll, cronDayOfWeek); trigger = new CronTriggerImpl(triggerName, triggerGroup, jobName, jobGroup, schedulerStart, schedulerFinish, cronExpression); } else if (isManyTimesPerDay) { // multitrigger??? } } else if (_periodicity.IsMonthly) { if (_periodicity.IsMonthlyCustom) { if (isOncePerDay) { string cronExpression = GetCronExpression(syncTime, _periodicity.DayOfMonth.ToString(), cronAll, cronNoSpecific); trigger = new CronTriggerImpl(triggerName, triggerGroup, jobName, jobGroup, schedulerStart, schedulerFinish, cronExpression); } else if (isManyTimesPerDay) { // multitrigger??? } } else if (_periodicity.IsMonthlyLastDay) { if (isOncePerDay) { string cronExpression = GetCronExpression(syncTime, cronLast, cronAll, cronNoSpecific); trigger = new CronTriggerImpl(triggerName, triggerGroup, jobName, jobGroup, schedulerStart, schedulerFinish, cronExpression); } else if (isManyTimesPerDay) { // multitrigger??? } } } if (trigger != null) { trigger.MisfireInstruction = MisfireInstruction.SimpleTrigger.FireNow; // TODO: SimpleTrigger???? scheduler.ScheduleJob(job, trigger); } }
private static async Task RunScheduler() { // 创建作业调度器 ISchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); // 开始运行调度器 await scheduler.Start(); // 创建一个作业 IJobDetail job = JobBuilder.Create <HelloJob>() .WithIdentity("job1", "jobGroup1") .StoreDurably() .Build(); // 设置trigger开始时间 var startAt = DateTimeOffset.Now; // 排除一天中的时间范围不执行 DailyCalendar dailyCalendar = new DailyCalendar(DateBuilder.DateOf(21, 0, 0).DateTime, DateBuilder.DateOf(22, 0, 0).DateTime); // 排除星期中的一天或多天 WeeklyCalendar weeklyCalendar = new WeeklyCalendar(); weeklyCalendar.SetDayExcluded(DayOfWeek.Friday, true); // 指定特定的日期,精确到天 HolidayCalendar holidayCalendar = new HolidayCalendar(); var holidayDateTime = new DateTime(2018, 11, 11); holidayCalendar.AddExcludedDate(holidayDateTime); // 排除月份中的某天,可选值为1-31,精确到天 MonthlyCalendar monthlyCalendar = new MonthlyCalendar(); monthlyCalendar.SetDayExcluded(31, true); // 排除每年中的某天,精确到天 AnnualCalendar annualCalendar = new AnnualCalendar(); var annualDateTime = new DateTime(2018, 11, 11); annualCalendar.SetDayExcluded(annualDateTime, true); // 使用表达式排除某些时间段不执行 CronCalendar cronCalendar = new CronCalendar("* * * 24 3 ?"); await scheduler.AddCalendar("calendar", cronCalendar, true, true); // trigger的附属信息 var triggerDataMap = new JobDataMap(); triggerDataMap.Add("name", "beck"); // 创建触发器 ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity("trigger1", "triggerGroup1") .StartAt(DateBuilder.DateOf(18, 25, 40)) .WithDailyTimeIntervalSchedule(w => w .WithRepeatCount(20) .WithIntervalInSeconds(4) .WithMisfireHandlingInstructionIgnoreMisfires()) //.WithSimpleSchedule(w => w // .WithRepeatCount(20) // .WithIntervalInHours(1) // .WithMisfireHandlingInstructionNowWithExistingCount()) .UsingJobData(triggerDataMap) .WithPriority(3) .Build(); // 创建触发器 ITrigger trigger2 = TriggerBuilder.Create() .WithIdentity("trigger2", "triggerGroup1") .StartAt(startAt) .WithCronSchedule("* * * 24-25 3 ?") .ForJob(job) .UsingJobData(triggerDataMap) .ModifiedByCalendar("calendar") .WithPriority(7) .Build(); // 加入作业调度器中 await scheduler.ScheduleJob(job, trigger1); await scheduler.ScheduleJob(trigger2); await Task.Delay(TimeSpan.FromMinutes(2)); // 关闭scheduler await scheduler.Shutdown(true); }
static void InitializeDaily(DailyCalendar dailyCalendar, IDailyCalendar calendar) { dailyCalendar.TimeZone = TimeZoneInfo.FindSystemTimeZoneById(Persistent.Base.General.RegistryTimeZoneProvider.GetRegistryKeyNameByTimeZoneId(calendar.TimeZone)); calendar.DateRanges.ToList().ForEach(range => dailyCalendar.SetTimeRange(range.StartPoint, range.EndPoint)); }