Example #1
0
 public DailyCalendarDto(DailyCalendar calendar) : base(calendar)
 {
     InvertTimeRange = calendar.InvertTimeRange;
     TimeZone        = new TimeZoneDto(calendar.TimeZone);
 }
Example #2
0
        private ICalendar parseDailyCalendar(XElement calendarXml)
        {
            DailyCalendar calendar = new DailyCalendar(parseRangeStartingTime(calendarXml), parseRangeEndingTime(calendarXml));

            return(calendar);
        }
Example #3
0
 public DailyCalendarDto(DailyCalendar calendar, string calendarName) : base(calendar, calendarName)
 {
     InvertTimeRange = calendar.InvertTimeRange;
     TimeZone        = new TimeZoneDto(calendar.TimeZone);
 }
Example #4
0

        
Example #5
0
        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);
            }
        }
Example #6
0
        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);
        }
Example #7
0
 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));
 }