Quartz.NET, повторять каждые x недель - PullRequest
7 голосов
/ 01 февраля 2011

Мне нужно реализовать следующий сценарий, используя Quartz.NET:

Повторяется каждые n недель:
Воскресенье и / или понедельник, вторник, среда, четверг, пятница, суббота ...

Так, например, я мог бы выбрать: понедельник и четверг и повторяться каждые 2 недели, это возможно?

Я понял, что для этого стоит использовать Cron Expressions, но мне пока не повезло с "Recur Every X Weeks"

Спасибо!

Ответы [ 4 ]

7 голосов
/ 02 февраля 2011

Работает ли Quartz.Net 2.0 и опция для вас? Он еще не был официально выпущен, но в нем есть новый тип триггера, который решает вашу проблему. Это называется триггер календарного интервала. В основном вы определяете это так, как вы описали в своем вопросе. Вы устанавливаете интервал на 2, а интервал - на недели, и он срабатывает каждые 2 недели. Я написал пост, описывающий это здесь . Вы можете получить доступ к документации по исходному коду здесь .

6 голосов
/ 03 февраля 2011

Это решение, которое я использовал ...

Когда нет рецидивов, я использую триггер cron, выбираю дни и запускаю его каждую неделю

EG 0 0 * *1,2,3

когда есть рекурсия для каждого выбранного дня, я добавляю SimpleTrigger, в основном, датой начала является день недели, а затем я вычисляю рецидив, умножая рекурсивность на 7

Так что я буду в конечном итоге с одним симплетригером на каждый день.

Надеюсь, это поможет кому-то еще!

3 голосов
/ 01 февраля 2011

Это полный триггер, вы можете управлять тремя триггерами;

  1. триггер выборки за 2 недели cron: "0 0 0 1 *"
  2. триггер выборки за 2 недели: "0 0 0 15 *"
  3. выбран триггерпример дня cron: "0 0 0? * SUN-SAT"

первый триггер создаст 3. второй триггер удалит 3.

Удачи.

0 голосов
/ 09 июня 2011

К сожалению, Quartz.Net 2 не выпущен, не имеет документов и вносит серьезные изменения.

Как говорят Аурелиано и Бонго, может помочь комбинация триггеров, но я не совсем понимаю их соответствующие решения.

Мое решение - обернуть CronTrigger и пропустить нежелательные события:

var ct = new CronTrigger();
ct.CronExpression = new CronExpression(
    string.Format("0 {0} {1} ? * {2} *", 
    minuteOfHour, hourOfDay, daysList));
ct = new WeeklyTriggerWrapper(ct, 2);

public class WeeklyTriggerWrapper : CronTrigger
{
    public CronTrigger Trigger
    {
        get;
        private set;
    }

    public int WeekInterval
    {
        get;
        private set;
    }

    public DateTime? LastFireDateTime
    {
        get;
        private set;
    }

    public WeeklyTriggerWrapper(CronTrigger trigger, int weekInterval)
    {
        Trigger = trigger;
        WeekInterval = weekInterval;
    }

    public override DateTime? ComputeFirstFireTimeUtc(ICalendar cal)
    {
        return Trigger.ComputeFirstFireTimeUtc(cal);
    }

    public override DateTime? GetFireTimeAfter(DateTime? afterTimeUtc)
    {
        var result = Trigger.GetFireTimeAfter(afterTimeUtc);

        if (result.HasValue)
        {
            DateTime reference = StartTimeUtc;

            if (LastFireDateTime.HasValue && LastFireDateTime.Value > reference)
                reference = LastFireDateTime.Value;

            reference = reference.AddDays(7 * WeekInterval);

            while (result.HasValue && result.Value < reference)
                result = Trigger.GetFireTimeAfter(result.Value);
        }

        LastFireDateTime = result;
        return result;
    }

    // TODO: handle events...
}
...