Quartz.NET, Recur Every x Weeks

[亡魂溺海] 提交于 2019-11-27 23:11:19

Is running Quartz.Net 2.0 and option for you? It has not been officially released yet, but in it there is a new trigger type that solves your problem. It's called the calendar interval trigger. Basically you define it just as you described in your question. You set the interval to 2 and the interval unit to weeks, and it fires every 2 weeks. I've written a post describing it here. You can access the source code documentation here.

This is the solution that i used...

When there is no recurence i use a cron trigger and select the days and make it run every week

E.G. 0 0 * * 1,2,3

when there is recurence for each selected day i add a SimpleTrigger, bassically the start date is the day of the week, and then i calculate the recurrence by multiplying the recurence for 7

So i will end up wit one simpletrigger for each day.

I hope this helps someone else!

It is a complext trigger, you can manage by 3 triggers;

  1. trigger 2 weeks sample cron: "0 0 0 1 *"
  2. trigger 2 weeks sample cron: "0 0 0 15 *"
  3. trigger trig selected days sample cron: "0 0 0 ? * SUN-SAT"

first trigger will create 3. second trigger will remove 3.

Good luck.

Unfortunately Quartz.Net 2 is unreleased, undocumented, and introduces breaking changes.

Like Aureliano and Bongo say, a combination of triggers might help but I do not quite understand their respective solutions.

My solution is to wrap a CronTrigger and skip the unwanted events :

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...
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!