Example #1
0
        /// <summary>
        /// 获取 Cron 表达式下一个发生时间
        /// </summary>
        /// <param name="expression"></param>
        /// <param name="cronFormat"></param>
        /// <returns></returns>
        public static DateTime?GetCronNextOccurrence(string expression, CronFormat cronFormat = CronFormat.Standard)
        {
            // 解析 Cron 表达式
            var cronExpression = CronExpression.Parse(expression, cronFormat);

            // 获取下一个执行时间
            var nextTime = cronExpression.GetNextOccurrence(DateTimeOffset.Now, TimeZoneInfo.Local);

            return(nextTime?.DateTime);
        }
Example #2
0
        public static string ToString(this CronExpression cronExpression, CronFormat cronFormat)
        {
            var cronExpressionString = cronExpression.ToString();

            if (cronFormat == CronFormat.Standard)
            {
                // todo: removes seconds from string representation
                return(cronExpressionString.Substring(2));
            }

            return(cronExpressionString);
        }
Example #3
0
        public void RunAsCronJob(string cron, CronFormat format = CronFormat.Standard)
        {
            ITaskSchedule schedule = new CronSchedule(cron, format);

            _optionsFactory += builder =>
            {
                if (builder.Schedule != null)
                {
                    throw new ArgumentException("A schedule for this task has already been set.");
                }

                builder.Schedule = schedule;
            };

            if (_asyncAction != null)
            {
                _taskBucket.AddBackgroundTask(_asyncAction, _optionsFactory);
            }
            else
            {
                _taskBucket.AddBackgroundTask(_syncAction, _optionsFactory);
            }
        }
Example #4
0
        public static unsafe CronExpression Parse(string expression, CronFormat format)
        {
            if (string.IsNullOrEmpty(expression))
            {
                throw new ArgumentNullException(nameof(expression));

                fixed(char *value = expression)
                {
                    var pointer = value;

                    SkipWhiteSpaces(ref pointer);

                    CronExpression cronExpression;

                    if (Accept(ref pointer, '@'))
                    {
                        cronExpression = ParseMacro(ref pointer);
                        SkipWhiteSpaces(ref pointer);

                        if (cronExpression == null || !IsEndOfString(*pointer))
                        {
                            ThrowFormatException("Macro: Unexpected character '{0}' on position {1}.", *pointer, pointer - value);
                        }

                        return(cronExpression);
                    }

                    cronExpression = new CronExpression();

                    if (format == CronFormat.IncludeSeconds)
                    {
                        cronExpression._second = ParseField(CronField.Seconds, ref pointer, ref cronExpression._flags);
                        ParseWhiteSpace(CronField.Seconds, ref pointer);
                    }
                    else
                    {
                        SetBit(ref cronExpression._second, CronField.Seconds.First);
                    }

                    cronExpression._minute = ParseField(CronField.Minutes, ref pointer, ref cronExpression._flags);
                    ParseWhiteSpace(CronField.Minutes, ref pointer);

                    cronExpression._hour = (int)ParseField(CronField.Hours, ref pointer, ref cronExpression._flags);
                    ParseWhiteSpace(CronField.Hours, ref pointer);

                    cronExpression._dayOfMonth = (int)ParseDayOfMonth(ref pointer, ref cronExpression._flags, ref cronExpression._lastMonthOffset);
                    ParseWhiteSpace(CronField.DaysOfMonth, ref pointer);

                    cronExpression._month = (short)ParseField(CronField.Months, ref pointer, ref cronExpression._flags);
                    ParseWhiteSpace(CronField.Months, ref pointer);

                    cronExpression._dayOfWeek = (byte)ParseDayOfWeek(ref pointer, ref cronExpression._flags, ref cronExpression._nthdayOfWeek);
                    ParseEndOfString(ref pointer);

                    // Make sundays equivalent.
                    if ((cronExpression._dayOfWeek & SundayBits) != 0)
                    {
                        cronExpression._dayOfWeek |= SundayBits;
                    }

                    return(cronExpression);
                }
        }
 /// <summary>
 /// Initializes new instances of <see cref="MilvaCronJobService"/>
 /// </summary>
 /// <param name="cronExpression"></param>
 /// <param name="timeZoneInfo"></param>
 /// <param name="cronFormat"></param>
 protected MilvaCronJobService(string cronExpression, TimeZoneInfo timeZoneInfo, CronFormat cronFormat)
 {
     _expression   = CronExpression.Parse(cronExpression, cronFormat);
     _timeZoneInfo = timeZoneInfo;
 }
Example #6
0
 public CronTrigger(string expression, CronFormat format, TimeSpan fireOffset)
     : this(CronExpression.Parse(expression, format), fireOffset)
 {
 }
Example #7
0
 public CronTrigger(string expression, CronFormat format)
     : this(CronExpression.Parse(expression, format), TimeSpan.Zero)
 {
 }
Example #8
0
 /// <summary>
 /// 开始执行 Cron 表达式任务
 /// </summary>
 /// <param name="expression">Cron 表达式</param>
 /// <param name="doWhat"></param>
 /// <param name="workerName"></param>
 /// <param name="description"></param>
 /// <param name="startNow"></param>
 /// <param name="cancelInNoneNextTime"></param>
 /// <param name="cronFormat">配置 Cron 表达式格式化</param>
 /// <param name="executeType"></param>
 public static void Do(string expression, Action <SpareTimer, long> doWhat = default, string workerName = default, string description = default, bool startNow = true, bool cancelInNoneNextTime = true, CronFormat cronFormat = CronFormat.Standard, SpareTimeExecuteTypes executeType = SpareTimeExecuteTypes.Parallel)
 {
     Do(() => GetCronNextOccurrence(expression, cronFormat), doWhat, workerName, description, startNow, cancelInNoneNextTime, executeType);
 }
Example #9
0
 /// <summary>
 /// 开始 Cron 表达式任务(持续的)
 /// <para>用于 Worker Services</para>
 /// </summary>
 /// <param name="expression"></param>
 /// <param name="doWhat"></param>
 /// <param name="stoppingToken"></param>
 /// <param name="cronFormat"></param>
 /// <returns></returns>
 public static Task DoAsync(string expression, Action doWhat, CancellationToken stoppingToken, CronFormat cronFormat = CronFormat.Standard)
 {
     return(DoAsync(() => GetCronNextOccurrence(expression, cronFormat), doWhat, stoppingToken));
 }
 protected CronJobService(ILogger <CronJobService> logger, string cronExpression, TimeZoneInfo timeZoneInfo, CronFormat cronFormat = CronFormat.Standard)
 {
     _cronExpression = cronExpression;
     _expression     = CronExpression.Parse(cronExpression, cronFormat);
     _logger         = logger;
     _timeZoneInfo   = timeZoneInfo;
 }
Example #11
0
        public static CronExpression Parse(string expression, TimeSpan offset, CronFormat format)
        {
            string[] expressions = expression.Split(new[] { ExpressionSeperator }, StringSplitOptions.RemoveEmptyEntries);

            IRange nanoseconds;
            IRange microseconds;
            IRange milliseconds;
            IRange seconds;
            IRange minutes;
            IRange hours;
            IDayRange daysOfMonth;
            IRange months;
            IDayRange daysOfWeek;
            IRange years;

            if (format == CronFormat.Extended)
            {
                if (expressions.Length != 9 && expressions.Length != 10)
                {
                    throw new ArgumentException();
                }

                nanoseconds = ParseRange(expressions[0], 100, 0, 900);
                microseconds = ParseRange(expressions[1], 1, 0, 999);
                milliseconds = ParseRange(expressions[2], 1, 0, 999);
                seconds = ParseRange(expressions[3], 1, 0, 59);
                minutes = ParseRange(expressions[4], 1, 0, 59);
                hours = ParseRange(expressions[5], 1, 0, 23);
                daysOfMonth = ParseRangeDayOfMonth(expressions[6]);
                months = ParseRangeMonth(expressions[7]);
                daysOfWeek = ParseRangeDayOfWeek(expressions[8]);
                years = expressions.Length == 10 ? ParseRange(expressions[9], 1, DateTimeOffset.MinValue.Year, DateTimeOffset.MaxValue.Year) : null;
                return new CronExpression(nanoseconds, microseconds, milliseconds, seconds, minutes, hours, daysOfMonth, months, daysOfWeek, years, offset);
            }

            if (expressions.Length != 6 && expressions.Length != 7)
            {
                throw new ArgumentException();
            }

            nanoseconds = new ImplicitRange(100, 0, 0);
            microseconds = new ImplicitRange(1, 0, 0);
            milliseconds = new ImplicitRange(1, 0, 0);
            seconds = ParseRange(expressions[0], 1, 0, 59);
            minutes = ParseRange(expressions[1], 1, 0, 59);
            hours = ParseRange(expressions[2], 1, 0, 23);
            daysOfMonth = ParseRangeDayOfMonth(expressions[3]);
            months = ParseRangeMonth(expressions[4]);
            daysOfWeek = ParseRangeDayOfWeek(expressions[5]);
            years = expressions.Length == 7 ? ParseRange(expressions[6], 1, DateTimeOffset.MinValue.Year, DateTimeOffset.MaxValue.Year) : null;
            return new CronExpression(nanoseconds, microseconds, milliseconds, seconds, minutes, hours, daysOfMonth, months, daysOfWeek, years, offset);
        }
Example #12
0
 public static CronExpression Parse(string expression, CronFormat format)
 {
     return Parse(expression, DateTimeOffset.Now.Offset, format);
 }
Example #13
0
 public CronSchedule(string cron, CronFormat format = CronFormat.Standard)
 {
     _cronSchedule = CronExpression.Parse(cron, format);
 }