예제 #1
0
        public static bool IsJobScheduledToRunNow(JobSchedule jobSchedule, DateTime NOW)
        {
            switch (jobSchedule.JobScheduleType)
            {
            case JobScheduleTypeEnum.JobScheduleDaily:
                JobScheduleDaily daily = JsonConvert.DeserializeObject <JobScheduleDaily>(jobSchedule.ScheduleConfig.ToString());
                return(IsTimeToRunNow(GetDailyTime(daily, NOW), NOW));

            case JobScheduleTypeEnum.JobScheduleWeekly:
                JobScheduleWeekly weekly = JsonConvert.DeserializeObject <JobScheduleWeekly>(jobSchedule.ScheduleConfig.ToString());
                return(DoWeeklyCheck(weekly, NOW));

            case JobScheduleTypeEnum.JobScheduleMonthly:
                JobScheduleMonthly monthly = JsonConvert.DeserializeObject <JobScheduleMonthly>(jobSchedule.ScheduleConfig.ToString());
                return(IsTimeToRunNow(GetMonthlyTime(monthly, NOW), NOW));

            case JobScheduleTypeEnum.JobScheduleYearly:
                JobScheduleYearly yearly = JsonConvert.DeserializeObject <JobScheduleYearly>(jobSchedule.ScheduleConfig.ToString());
                return(IsTimeToRunNow(GetYearlyTime(yearly, NOW), NOW));

            case JobScheduleTypeEnum.JobScheduleOneTimeOnly:
                JobScheduleOneTimeOnly oneTime = JsonConvert.DeserializeObject <JobScheduleOneTimeOnly>(jobSchedule.ScheduleConfig.ToString());
                return(DoOneTimeOnlyCheck(oneTime, NOW));

            default:
                throw new Exception("Unknown Schedule Type: " + jobSchedule.JobScheduleType.ToString());
            }
        }
        public void WeeklyOvernightTest_Last()
        {
            JobScheduleWeekly schedule = new JobScheduleWeekly();

            schedule.Day                = new JobScheduleWeeklyDay();
            schedule.Day.DayName        = DayName.Sunday;
            schedule.Day.Time           = GetOvernightTime();
            schedule.Day.WeekRecurrence = WeekRecurrence.Last;

            RunForWeekly(schedule, 0);
        }
        public void WeeklyOvernightTest_Sixth()
        {
            JobScheduleWeekly schedule = new JobScheduleWeekly();

            schedule.Day                = new JobScheduleWeeklyDay();
            schedule.Day.DayName        = DayName.Sunday;
            schedule.Day.Time           = GetOvernightTime();
            schedule.Day.WeekRecurrence = WeekRecurrence.Sixth;

            RunForWeekly(schedule, (int)schedule.Day.WeekRecurrence);
        }
        public void WeeklyDayTest_Fifth()
        {
            JobScheduleWeekly schedule = new JobScheduleWeekly();

            schedule.Day                = new JobScheduleWeeklyDay();
            schedule.Day.DayName        = DayName.Sunday;
            schedule.Day.Time           = GetDayTime();
            schedule.Day.WeekRecurrence = WeekRecurrence.Fifth;

            RunForWeekly(schedule, (int)schedule.Day.WeekRecurrence);
        }
예제 #5
0
        private static void SetupWeeklyRunOnce()
        {
            weeklyRunOnceJob.JobName      = "Test_WeeklyRunOnce";
            weeklyRunOnceJob.ExecuteTimes = 1;

            JobScheduleWeekly weekly = new JobScheduleWeekly();

            weekly.Day                = new JobScheduleWeeklyDay();
            weekly.Day.DayName        = DayName.Friday;
            weekly.Day.Time           = new Time();
            weekly.Day.Time.StartTime = new DateTime(1, 1, 1, 2, 0, 0);

            AddJobToEngine(weeklyRunOnceJob, weekly);
        }
예제 #6
0
        public void WeeklyRunOnce()
        {
            List <DateTime>   expectedDates = new List <DateTime>();
            JobScheduleWeekly weekly        = ((JobScheduleWeekly)weeklyRunOnceJob.Schedules[0].ScheduleConfig);
            DateTime          s             = t.StartTime.Add(weekly.Day.Time.StartTime.TimeOfDay);

            while (s.DayOfWeek.ToString() != weekly.Day.DayName.ToString())
            {
                s = s.AddDays(1);
            }

            while (s <= t.EndTime)
            {
                expectedDates.Add(s);
                s = s.AddDays(7);
            }
            VerifyRun(weeklyRunOnceJob.JobName, expectedDates);
        }
예제 #7
0
        private static bool DoWeeklyCheck(JobScheduleWeekly weekly, DateTime NOW)
        {
            DateTime OriginalNOW = NOW;

            if (weekly.Day.Time.StartTime.TimeOfDay > weekly.Day.Time.EndTime.TimeOfDay)
            {
                //has overnight, if we are running for next day, set now one day back
                if (NOW.TimeOfDay <= weekly.Day.Time.EndTime.TimeOfDay)
                {
                    NOW = NOW.AddDays(-1);
                }
            }

            if (weekly.Day.DayName.ToString() != NOW.DayOfWeek.ToString())
            {
                return(false);
            }

            int weekOfMonth = DateTimeExtensions.GetWeekOfMonth(NOW);

            if (weekly.Day.WeekRecurrence != WeekRecurrence.Every)
            {
                if (weekly.Day.WeekRecurrence == WeekRecurrence.Last)
                {
                    if (NOW.Day <= (DateTime.DaysInMonth(NOW.Year, NOW.Month) - 7))
                    {
                        return(false);
                    }
                }

                else if (weekOfMonth != (int)weekly.Day.WeekRecurrence)
                {
                    return(false);
                }
            }

            //week related checks are done, just need to check if time is fine now
            weekly.Day.Time.StartTime = new DateTime(NOW.Year, NOW.Month, NOW.Day).Add(weekly.Day.Time.StartTime.TimeOfDay);
            weekly.Day.Time.EndTime   = new DateTime(NOW.Year, NOW.Month, NOW.Day).Add(weekly.Day.Time.EndTime.TimeOfDay);

            return(IsTimeToRunNow(AdjustIfOvernight(weekly.Day.Time), OriginalNOW));
        }
        public void WeeklyDayTest_Every()
        {
            JobSchedule       WeeklyDaySchedule = new JobSchedule();
            JobScheduleWeekly schedule          = new JobScheduleWeekly();

            schedule.Day                     = new JobScheduleWeeklyDay();
            schedule.Day.DayName             = DayName.Sunday;
            schedule.Day.Time                = GetDayTime();
            schedule.Day.WeekRecurrence      = WeekRecurrence.Every;
            WeeklyDaySchedule.ScheduleConfig = schedule;


            DateTime dt = startTestTime.AddMonths(-2);

            while ((int)dt.DayOfWeek != (int)schedule.Day.DayName)
            {
                dt = dt.AddDays(1);
            }

            System.Collections.Generic.Dictionary <DateTime, DateTime> validRanges = new System.Collections.Generic.Dictionary <DateTime, DateTime>();

            while (dt <= endTestTime)
            {
                dt = dt.AddDays(7);
                //if (DateTime.DaysInMonth(dt.Year, dt.Month) < schedule.Day.Day)
                //    continue;

                DateTime s = new DateTime(dt.Year, dt.Month, dt.Day);
                DateTime e = s;
                s = s.Add(schedule.Day.Time.StartTime.TimeOfDay);
                e = e.Add(schedule.Day.Time.EndTime.TimeOfDay);

                validRanges.Add(s, e);
            }

            RunTests(WeeklyDaySchedule, validRanges);
        }
예제 #9
0
        private void Initialize(Engine engine)
        {
            try
            {
                SamayLogger.SetLogLevel(SamayLogger.SamayEngineLoggingGUID, engine.EngineConfig.LogLevel);
                LogInfo(JsonConvert.SerializeObject(engine, Formatting.Indented));

                AppDomain   ad = AppDomain.CreateDomain("SamayEnginedomain" + DateTime.Now.ToString());
                TaskFactory tf = (TaskFactory)ad.CreateInstanceAndUnwrap(
                    Assembly.GetExecutingAssembly().FullName,
                    "Technisient.TaskFactory");
                _TaskAssemblyDict = tf.Initialize();

                AppDomain.Unload(ad);
                //TaskFactory.Initialize();


                //at the Job level, we still use the Engine log level
                foreach (SamayConfig.Job job in engine.Jobs)
                {
                    SamayLogger.SetLogLevel(job.Id, engine.EngineConfig.LogLevel);

                    if ((job.TaskChain.Task == null) || (job.TaskChain.Task.Count() == 0))
                    {
                        continue;
                    }

                    foreach (SamayConfig.Task task in job.TaskChain.Task)
                    {
                        SamayLogger.SetLogLevel(task.Id, task.LogLevel);
                    }
                }

                //cache Global Exclude Dates
                _GlobalExcludeDates = new List <DateTime>();
                if (engine.EngineConfig.GlobalExcludeDates != null)
                {
                    foreach (GlobalExcludeDate dt in engine.EngineConfig.GlobalExcludeDates)
                    {
                        _GlobalExcludeDates.Add(dt.Date);
                    }
                }

                _jobExcludeDates = new Dictionary <string, List <DateTime> >();
                //cache JobExclude Dates
                foreach (Job job in engine.Jobs)
                {
                    List <DateTime> dtList = new List <DateTime>();
                    if (job.ExcludeDates != null)
                    {
                        foreach (JobExcludeDates exc in job.ExcludeDates)
                        {
                            dtList.Add(exc.Date);
                        }
                    }
                    _jobExcludeDates.Add(job.JobName, dtList);

                    // set endtime to really high number for jobs which do not run continously
                    if (job.ExecuteTimes != -1)
                    {
                        if (job.Schedules != null)
                        {
                            foreach (JobSchedule jobSchedule in job.Schedules)
                            {
                                Time t = new Time();
                                switch (jobSchedule.ScheduleConfig.GetType().Name)
                                {
                                case "EngineJobScheduleDaily":
                                    JobScheduleDaily daily = (JobScheduleDaily)jobSchedule.ScheduleConfig;
                                    t = daily.Time;
                                    break;

                                case "EngineJobScheduleWeekly":
                                    JobScheduleWeekly weekly = (JobScheduleWeekly)jobSchedule.ScheduleConfig;
                                    t = weekly.Day.Time;
                                    break;

                                case "EngineJobScheduleMonthly":
                                    JobScheduleMonthly monthly = (JobScheduleMonthly)jobSchedule.ScheduleConfig;
                                    t = monthly.Day.Time;
                                    break;

                                case "EngineJobScheduleYearly":
                                    JobScheduleYearly yearly = (JobScheduleYearly)jobSchedule.ScheduleConfig;
                                    t = yearly.Month.Time;
                                    break;

                                case "EngineJobScheduleOneTimeOnly":
                                    JobScheduleOneTimeOnly oneTime = (JobScheduleOneTimeOnly)jobSchedule.ScheduleConfig;
                                    if (!oneTime.EndDateTimeSpecified)
                                    {
                                        oneTime.EndDateTime          = oneTime.StartDateTime.AddYears(10);
                                        oneTime.EndDateTimeSpecified = true;
                                    }
                                    continue;

                                default:
                                    throw new Exception("Unknown Schedule Type: " + jobSchedule.ScheduleConfig.GetType().Name);
                                }
                                if (!t.EndTimeSpecified)
                                {
                                    if (job.ExecuteTimes == 1)
                                    {
                                        t.EndTime = t.StartTime.AddMinutes(1);
                                    }
                                    else if (job.Interval.ClockTime != null)
                                    {
                                        t.EndTime = t.StartTime;
                                        int count = 0;
                                        while (count < job.ExecuteTimes)
                                        {
                                            if (job.Interval.ClockTime.Contains(t.EndTime.Minute))
                                            {
                                                count++;
                                            }
                                            t.EndTime = t.EndTime.AddMinutes(1);
                                        }
                                    }
                                    else
                                    {
                                        int interval = (int)job.Interval.Interval_msec;
                                        t.EndTime = t.StartTime.AddMilliseconds(interval * job.ExecuteTimes).AddMinutes(1);
                                    }
                                    t.EndTimeSpecified = true;
                                }
                            }
                        }
                    }
                }

                LogInfo("Starting Up Engine");
            }
            catch (Exception ex)
            {
                string sSource = "Technisient Samay";
                string sLog    = "Samay Engine";

                if (!EventLog.SourceExists(sSource))
                {
                    EventLog.CreateEventSource(sSource, sLog);
                }
                EventLog.WriteEntry(sSource, ex.ToString());
            }
        }
        ///////////////////////////////////


        private static void RunForWeekly(JobScheduleWeekly schedule, int weekNumber)
        {
            bool isLast = (weekNumber == 0)?true:false;

            JobSchedule WeeklyDaySchedule = new JobSchedule();

            WeeklyDaySchedule.ScheduleConfig = schedule;

            DateTime dt = startTestTime.AddMonths(-2);

            System.Collections.Generic.Dictionary <DateTime, DateTime> validRanges = new System.Collections.Generic.Dictionary <DateTime, DateTime>();

            int       n  = 0;
            DayOfWeek dw = DayOfWeek.Sunday;

            while (dt <= endTestTime)
            {
                dt = dt.AddDays(1);
                //dt = DateTime.Parse("1/22/2012 8:00:00 PM");
                if (dt.Day == 1)
                {
                    n  = 0;
                    dw = dt.DayOfWeek;
                }

                if (dt.DayOfWeek == dw)
                {
                    n++;
                }

                bool isValid = false;
                if (isLast)
                {
                    if ((IsLastDayOccuranceForMonth(dt)) && ((int)dt.DayOfWeek == (int)schedule.Day.DayName))
                    {
                        isValid = true;
                    }
                }
                else if ((n == weekNumber) && ((int)dt.DayOfWeek == (int)schedule.Day.DayName))
                {
                    isValid = true;
                }

                if (!isValid)
                {
                    continue;
                }

                DateTime s = new DateTime(dt.Year, dt.Month, dt.Day);
                DateTime e = s;
                s = s.Add(schedule.Day.Time.StartTime.TimeOfDay);
                e = e.Add(schedule.Day.Time.EndTime.TimeOfDay);

                if (s.TimeOfDay > e.TimeOfDay)
                {
                    e = e.AddDays(1);
                }

                validRanges.Add(s, e);
            }

            RunTests(WeeklyDaySchedule, validRanges);
        }