Quartz.NET, Recur Every x Weeks

前端 未结 4 1284
灰色年华
灰色年华 2020-12-06 07:29

i need to implement the following scenario using Quartz.NET:

Recur every n week(s) on:
Sunday and/or Monday, Tuesday, Wednesday, Thursday, Friday, Saturday...

4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-06 07:58

    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...
    }
    

提交回复
热议问题