Пример #1
0
        public void NullExpression_ReturnsFalseAndNullcronSchedule()
        {
            var result = CronSchedule.TryCreate(null, out CronSchedule schedule);

            Assert.Null(schedule);
            Assert.False(result);
        }
Пример #2
0
        public static void Main(string[] args)
        {
            var factory     = new SingularityFactory();
            var singularity = factory.GetSingularity();

            var job = new SimpleParameterizedJob <string>((parameter, scheduledTime) =>
                                                          Console.WriteLine($"{parameter}\tscheduled: {scheduledTime.ToString("o")}"));

            var schedule = new EveryXTimeSchedule(TimeSpan.FromSeconds(1));

            var scheduledJob = singularity.ScheduleParameterizedJob(
                schedule, job, "Hello World", true); //starts immediately

            var startTime = DateTime.UtcNow.Add(TimeSpan.FromSeconds(5));
            var schedule2 = new CronSchedule("* * * * * * *");

            var scheduledJob2 = singularity.ScheduleParameterizedJob(
                schedule2, job, "Hello World 2", startTime);

            var scheduledJob3 = singularity.ScheduleParameterizedJob(
                new RunOnceSchedule(TimeSpan.FromSeconds(3)), job, "Hello World 3", false);

            singularity.Start();

            Task.Delay(10 * 1000).Wait();

            singularity.StopScheduledJob(scheduledJob);

            Task.Delay(5 * 1000).Wait();

            singularity.Stop();

            Console.ReadKey();
        }
Пример #3
0
        public void generate_values_range_test()
        {
            var        cron_schedule = new CronSchedule("1-10");
            List <int> results       = cron_schedule.minutes.GetRange(0, 10);//(, 0, 10);

            Assert.AreEqual(results.ToArray(), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
        }
Пример #4
0
        private (string name, TaskConfiguration taskConfiguration) CreateTaskConfiguration(CsissorsTaskAttribute taskAttribute, TimeSpan leaseDuration)
        {
            ISchedule schedule;

            if (taskAttribute.Schedule != null)
            {
                CronExpression cronExpression = CronExpression.Parse(taskAttribute.Schedule);
                TimeZoneInfo   timeZoneInfo   = taskAttribute.TimeZone != null
                    ? TimeZoneInfo.FindSystemTimeZoneById(taskAttribute.TimeZone)
                    : TimeZoneInfo.Utc;

                schedule = new CronSchedule(cronExpression, timeZoneInfo, taskAttribute.FastForward);
            }
            else
            {
                schedule = new IntervalSchedule(
                    new TimeSpan(taskAttribute.Days, taskAttribute.Hours, taskAttribute.Minutes, taskAttribute.Seconds),
                    taskAttribute.FastForward
                    );
            }
            var taskName = taskAttribute.Name ?? _methodInfo.Name;
            var data     = new Dictionary <string, object?>();

            return(taskName, new TaskConfiguration(
                       schedule,
                       taskAttribute.FailureMode,
                       taskAttribute.ExecutionMode,
                       leaseDuration,
                       data
                       ));
        }
Пример #5
0
        public void Create_CronSchedule_CreatesExpectedSchedule()
        {
            TimerTriggerAttribute attribute    = new TimerTriggerAttribute("*/15 * * * * *");
            INameResolver         nameResolver = new TestNameResolver();
            CronSchedule          schedule     = (CronSchedule)TimerSchedule.Create(attribute, nameResolver);

            Assert.False(attribute.UseMonitor);

            DateTime now            = new DateTime(2015, 5, 22, 9, 45, 00);
            DateTime nextOccurrence = schedule.GetNextOccurrence(now);

            Assert.Equal(new TimeSpan(0, 0, 15), nextOccurrence - now);

            // For schedules occuring on an interval greater than a minute, we expect
            // UseMonitor to be defaulted to true
            attribute = new TimerTriggerAttribute("0 0 * * * *");
            schedule  = (CronSchedule)TimerSchedule.Create(attribute, nameResolver);
            Assert.True(attribute.UseMonitor);

            // verify that if UseMonitor is set explicitly, it is not overridden
            attribute            = new TimerTriggerAttribute("0 0 * * * *");
            attribute.UseMonitor = false;
            schedule             = (CronSchedule)TimerSchedule.Create(attribute, nameResolver);
            Assert.False(attribute.UseMonitor);
        }
Пример #6
0
        public void list_array_test()
        {
            var        cron_schedule = new CronSchedule("1,2,3,4,5,6,7,8,9,10");
            List <int> results       = cron_schedule.minutes;

            Assert.AreEqual(results.ToArray(), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
        }
Пример #7
0
        public void ToString_ReturnsExpectedValue()
        {
            var result = CronSchedule.TryCreate("0 59 11 * * 1-5", out CronSchedule schedule);

            Assert.True(result);
            Assert.Equal("Cron: '0 59 11 * * 1-5'", schedule.ToString());
        }
Пример #8
0
        public void NextHourCronScheduleShouldNotBeInTime()
        {
            var schedule = new CronSchedule($"* {_now.Minute} {_now.Hour} {_now.Day} {_now.Month} *");

            _now += TimeSpan.FromHours(1);
            Assert.False(schedule.IsMatch(_now));
        }
Пример #9
0
        public void wild_array_test()
        {
            var        cron_schedule = new CronSchedule("*");
            List <int> results       = cron_schedule.minutes.GetRange(0, 10);//("*", 0, 10);

            Assert.AreEqual(results.ToArray(), new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
        }
Пример #10
0
        /// <summary>
        /// Constructs a new instance based on the schedule expression passed in.
        /// </summary>
        /// <param name="expression">A schedule expression. This can either be a 6 field crontab expression
        /// <a href="http://en.wikipedia.org/wiki/Cron#CRON_expression"/> or a <see cref="TimeSpan"/>
        /// string (e.g. "00:30:00").</param>
        public TimerTriggerAttribute(string expression)
        {
            CronSchedule cronSchedule = null;

            if (CronSchedule.TryCreate(expression, out cronSchedule))
            {
                Schedule = cronSchedule;

                DateTime[] nextOccurrences = cronSchedule.InnerSchedule.GetNextOccurrences(DateTime.Now, DateTime.Now + TimeSpan.FromMinutes(1)).ToArray();
                if (nextOccurrences.Length > 1)
                {
                    // if there is more than one occurrence due in the next minute,
                    // assume that this is a sub-minute constant schedule and disable
                    // persistence
                    UseMonitor = false;
                }
                else
                {
                    UseMonitor = true;
                }
            }
            else
            {
                TimeSpan periodTimespan = TimeSpan.Parse(expression);
                Schedule = new ConstantSchedule(periodTimespan);

                // for very frequent constant schedules, we want to disable persistence
                UseMonitor = periodTimespan.TotalMinutes >= 1;
            }
        }
        public void Create_CronSchedule_CreatesExpectedSchedule()
        {
            TimerTriggerAttribute attribute    = new TimerTriggerAttribute("*/15 * * * * *");
            INameResolver         nameResolver = new TestNameResolver();
            CronSchedule          schedule     = (CronSchedule)TimerSchedule.Create(attribute, nameResolver, _logger);

            Assert.False(attribute.UseMonitor);
            var log = _loggerProvider.GetAllLogMessages().Single();

            Assert.Equal("UseMonitor changed to false based on schedule frequency.", log.FormattedMessage);
            Assert.Equal(LogLevel.Debug, log.Level);

            DateTime now            = new DateTime(2015, 5, 22, 9, 45, 00);
            DateTime nextOccurrence = schedule.GetNextOccurrence(now);

            Assert.Equal(new TimeSpan(0, 0, 15), nextOccurrence - now);

            // For schedules occuring on an interval greater than a minute, we expect
            // UseMonitor to be defaulted to true
            _loggerProvider.ClearAllLogMessages();
            attribute = new TimerTriggerAttribute("0 0 * * * *");
            schedule  = (CronSchedule)TimerSchedule.Create(attribute, nameResolver, _logger);
            Assert.True(attribute.UseMonitor);
            Assert.Empty(_loggerProvider.GetAllLogMessages());

            // verify that if UseMonitor is set explicitly, it is not overridden
            _loggerProvider.ClearAllLogMessages();
            attribute            = new TimerTriggerAttribute("0 0 * * * *");
            attribute.UseMonitor = false;
            schedule             = (CronSchedule)TimerSchedule.Create(attribute, nameResolver, _logger);
            Assert.False(attribute.UseMonitor);
            Assert.Empty(_loggerProvider.GetAllLogMessages());
        }
Пример #12
0
        public void generate_values_divided_test()
        {
            var        cron_schedule = new CronSchedule("*/2");
            List <int> results       = cron_schedule.minutes.GetRange(0, 5);//(, 0, 10);

            Assert.AreEqual(results.ToArray(), new int[] { 0, 2, 4, 6, 8 });
        }
Пример #13
0
        public ValidationResult Run()
        {
            var scrapingCronSchedule = Environment.GetEnvironmentVariable(EnvironmentVariables.Scraping.CronSchedule);

            if (string.IsNullOrWhiteSpace(scrapingCronSchedule))
            {
                LogMessage(
                    $"No scraping schedule was specified, falling back to default '{DefaultCronSchedule}' cron schedule...");
                scrapingCronSchedule = DefaultCronSchedule;
                Environment.SetEnvironmentVariable(EnvironmentVariables.Scraping.CronSchedule, scrapingCronSchedule);
            }

            try
            {
                CronSchedule.Parse(scrapingCronSchedule);
                return(ValidationResult.Successful(ComponentName));
            }
            catch (Exception exception)
            {
                LogMessage(
                    $"No valid scraping schedule was specified - '{scrapingCronSchedule}'. Details: {exception.Message}");
                return(ValidationResult.Failure(ComponentName,
                                                $"No valid scraping schedule was specified - '{scrapingCronSchedule}'."));
            }
        }
Пример #14
0
        public static void divided_array_test()
        {
            var        cronSchedule = new CronSchedule("*/2");
            List <int> results      = cronSchedule.Minutes.GetRange(0, 5);//("*/2", 0, 10);

            Assert.Equal(results.ToArray(), new int[] { 0, 2, 4, 6, 8 });
        }
Пример #15
0
        public void is_time_test()
        {
            var cron_schedule = new CronSchedule("0 0 12 10 *");

            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("12:00:00 am 10/12/2008")));
            Assert.IsFalse(cron_schedule.isTime(DateTime.Parse("12:01:00 am 10/12/2008")));
        }
Пример #16
0
        public void UniversalCronScheduleShouldBeValid()
        {
            Assert.True(CronSchedule.IsValid("* * * * * *"));

            var schedule = new CronSchedule("* * * * * *");

            Assert.True(schedule.IsValid());
        }
Пример #17
0
        public void NextMonthsCronScheduleShouldBeInGivenSpan()
        {
            var span     = TimeSpan.FromDays(9 * 31);
            var next     = _now + span;
            var schedule = new CronSchedule($"{next.Second} {next.Minute} {next.Hour} {next.Day} {next.Month} *");
            var time     = schedule.TimeToNextSchedule(_now);

            Assert.Equal((long)span.TotalSeconds, (long)time.TotalSeconds);
        }
Пример #18
0
        public void GetNextOccurrence_FivePartCronExpression_NowEqualToNext_ReturnsCorrectValue()
        {
            CronSchedule.TryCreate("* * * * *", out CronSchedule schedule);

            var now  = schedule.GetNextOccurrence(DateTime.Now);
            var next = schedule.GetNextOccurrence(now);

            Assert.True(next > now);
        }
Пример #19
0
        public void GetNextOccurrence_NowEqualToNext_ReturnsCorrectValue()
        {
            CronSchedule schedule = new CronSchedule("0 * * * * *");

            var now  = schedule.GetNextOccurrence(DateTime.Now);
            var next = schedule.GetNextOccurrence(now);

            Assert.True(next > now);
        }
Пример #20
0
        public void TimeToEvery30SecShouldBeLessThan30SecAlways()
        {
            var schedule = new CronSchedule("0,30 * * * * *");
            var remain   = schedule.TimeToNextSchedule(_now);

            Assert.True(remain <= TimeSpan.FromSeconds(30));

            remain = schedule.TimeToNextSchedule(DateTime.Now);
            Assert.True(remain <= TimeSpan.FromSeconds(30));
        }
Пример #21
0
        public void is_time_day_of_week_test()
        {
            var cron_schedule = new CronSchedule("* * * * 0");

            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("10/12/2008")));
            Assert.IsFalse(cron_schedule.isTime(DateTime.Parse("10/13/2008")));

            cron_schedule = new CronSchedule("* * * * */2");
            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("10/14/2008")));
        }
Пример #22
0
        public void is_time_hour_test()
        {
            var cron_schedule = new CronSchedule("* 0 * * *");

            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("12:00 am")));

            cron_schedule = new CronSchedule("* 0,12 * * *");
            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("12:00 am")));
            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("12:00 pm")));
        }
Пример #23
0
        private DateTime TestCronNext(string cron, DateTime date, string expectedDate)
        {
            var sched = new CronSchedule(cron);
            var next  = sched.TryGetNext(date);

            Assert.IsNotNull(next, "Expected next, CRON: '" + cron + "', date: " + date);
            var expected = DateTime.Parse(expectedDate);

            Assert.AreEqual(expected, next.Value, "Next date does not match expected.");
            return(next.Value);
        }
Пример #24
0
        public static void range_array_test()
        {
            var        cron_schedule = new CronSchedule("1-10");
            List <int> results       = cron_schedule.minutes.GetRange(0, 10);//();

            Assert.AreEqual(results.ToArray(), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
            var cs = new CronSchedule("1-10/3 20-45/4 * * *");

            results = cs.minutes;
            Assert.AreEqual(results.ToArray(), new int[] { 3, 6, 9 });
        }
Пример #25
0
        public void NextLeapYearCronScheduleShouldBePossible()
        {
            // starting july 2020
            _now = new DateTime(2020, 07, 15, 16, 00, 00);
            // next should be thursday 12:00
            var next = new DateTime(2024, 02, 29, 12, 00, 00);

            var schedule = new CronSchedule($"* * 12 29 02 *");
            var time     = schedule.NextSchedule(_now);

            Assert.Equal(next, time);
        }
Пример #26
0
        public void is_time_month_test()
        {
            var cron_schedule = new CronSchedule("* * * 1 *");

            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("1/1/2008")));

            cron_schedule = new CronSchedule("* * * 12 *");
            Assert.IsFalse(cron_schedule.isTime(DateTime.Parse("1/1/2008")));

            cron_schedule = new CronSchedule("* * * */3 *");
            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("3/1/2008")));
            Assert.IsTrue(cron_schedule.isTime(DateTime.Parse("6/1/2008")));
        }
Пример #27
0
        public SchedulerHostedService(IEnumerable <IScheduledTask> scheduledTasks)
        {
            var referenceTime = DateTime.UtcNow;

            foreach (var scheduledTask in scheduledTasks)
            {
                _scheduledTasks.Add(new SchedulerTaskWrapper
                {
                    Schedule    = CronSchedule.Parse(scheduledTask.Schedule),
                    Task        = scheduledTask,
                    NextRunTime = referenceTime
                });
            }
        }
Пример #28
0
        public void is_valid_test()
        {
            var cron_schedule = new CronSchedule();

            Assert.IsTrue(cron_schedule.isValid("*/2"));
            Assert.IsTrue(cron_schedule.isValid("* * * * *"));
            Assert.IsTrue(cron_schedule.isValid("0 * * * *"));
            Assert.IsTrue(cron_schedule.isValid("0,1,2 * * * *"));
            Assert.IsTrue(cron_schedule.isValid("*/2 * * * *"));
            Assert.IsTrue(cron_schedule.isValid("1-4 * * * *"));
            Assert.IsTrue(cron_schedule.isValid("1-55/3 * * * *"));
            Assert.IsTrue(cron_schedule.isValid("1,10,20 * * * *"));
            Assert.IsTrue(cron_schedule.isValid("* 1,10,20 * * *"));
        }
Пример #29
0
 private DateTime?GetNextDateTime()
 {
     try
     {
         DateTime nextTime;
         var      cs = CronSchedule.Parse(Expression);
         cs.GetNext(DateTime.Now, out nextTime);
         return(nextTime);
     }
     catch (Exception)
     {
         return(null);
     }
 }
Пример #30
0
        public void Create_UsesNameResolver()
        {
            TimerTriggerAttribute attribute    = new TimerTriggerAttribute("%test_schedule%");
            TestNameResolver      nameResolver = new TestNameResolver();

            nameResolver.Values.Add("test_schedule", "*/15 * * * * *");
            CronSchedule schedule = (CronSchedule)TimerSchedule.Create(attribute, nameResolver);

            Assert.False(attribute.UseMonitor);

            DateTime now            = new DateTime(2015, 5, 22, 9, 45, 00);
            DateTime nextOccurrence = schedule.GetNextOccurrence(now);

            Assert.Equal(new TimeSpan(0, 0, 15), nextOccurrence - now);
        }