Quartz.Net - Каждые 3 месяца - PullRequest
       39

Quartz.Net - Каждые 3 месяца

5 голосов
/ 02 сентября 2011

Я пытаюсь вызывать что-то каждые 3 месяца (ежеквартально) в Quartz.NET (используя как стабильную, так и последнюю версию 2, которая является бета-версией с теми же результатами).

Я создаю триггер хрон с 0 30 8 3 */3 ? *звонить каждые 3 месяца в 8:30 утра третьего месяца, когда это происходит.

Технически, так как сегодня, 2 сентября, я ожидаю, что это произойдет завтра.Тем не менее, следующий запуск показывается как следующий месяц.Почему это так?

Обновлено: в соответствии с полученными ответами я создал следующий метод - может быть полезным для кого-то:

public static string CalculateMonthsWithInterval(int startMonth, int interval)
        {
            var months = new List<string>();
            var monthNames = new [] {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};

            var monthSelector = startMonth % interval;

            for (var i = 0; i < 12; i++)
            {
                if (i % interval == monthSelector)
                {
                    months.Add(monthNames[i]);
                }
            }

            return string.Join(",", months.ToArray());
        }

Ps: я месяцами не пользовался индексами, потому что дляпо какой-то причине он не работал с моим Quartz (v2 BETA).Также его легче читать на уровне БД.

Пример вызова - Каждые 3 месяца на основе startDate:

var cronMonths = CronUtils.CalculateMonthsWithInterval((startDate.Month - 1), 3);

Ответы [ 2 ]

8 голосов
/ 02 сентября 2011

Ну, я думаю, это потому, что планировщик проверит, какой месяц можно разделить на 3, поскольку все месяцы в Кварце основаны на 0 (согласно: http://www.quartz -scheduler.org / documents / quartz-2.x/ tutorials / tutorial-lesson-06 ), месяц, который будет запланирован, будет январь, апрель, июль и октябрь.

0 mod 3 = 0 -> JAN
1 mod 3 = 1 -> FEB
...
8 mod 3 = 2 -> SEP
9 mod 3 = 0 -> OCT

Планировщик Quartz проанализирует ваше выражение cron и сохранит только тегде их модуль 3 равен 0.

Если вы хотите, чтобы он был за 1 месяц до этого (март, июнь, сентябрь и октябрь), вам нужно установить его на:

0 30 8 3 MAR,JUN,SEP,DEC ? *

5 голосов
/ 26 октября 2011

Хорошая страница для создания выражений cron: http://www.cronmaker.com/

Формат Cron:

0 0 12 1 1/3 ? *

Выполняется каждый:

1. Saturday, April 1, 2017 12:00 PM
2.  Saturday, July 1, 2017 12:00 PM
3.  Sunday, October 1, 2017 12:00 PM
4.  Monday, January 1, 2018 12:00 PM
5.  Sunday, April 1, 2018 12:00 PM
...