Quartz.NET,每x周重复一次
我需要使用Quartz.NET实现以下场景:
每隔n周重复一次:
周日和/或周一,周二,周三,周四,周五,周六……
例如,我可能会选择:星期一和星期四,每两周复发一次,这可能吗?
我认为可行的方法可能是使用Cron Expressions,但到目前为止,我还没有运气“Recur Every X Weeks”
谢谢!
是否运行Quartz.Net 2.0和选项? 它尚未正式发布,但在其中有一种新的触发类型可以解决您的问题。 它被称为日历间隔触发器。 基本上你就像你在问题中描述的那样定义它。 您将间隔设置为2,将间隔单位设置为周,并且每2周触发一次。 我在这里写了一篇描述它的post。 您可以在此处访问源代码文档。
这是我用过的解决方案……
当没有复发时,我使用cron触发器并选择日期并使其每周运行
EG 0 0 * * 1,2,3
当每个选定日都有一次复发时,我会添加一个SimpleTrigger,从开始日期开始,就是星期几,然后我通过乘以7的复发来计算复发。
因此,我每天最终会有一个简单的触发器。
我希望这可以帮助别人!
它是一个Complext触发器,您可以通过3个触发器进行管理;
- 触发2周样本cron:“0 0 0 1 *”
- 触发2周样本cron:“0 0 0 15 *”
- 触发trig选择天样本cron:“0 0 0?* SUN-SAT”
第一个触发器将创建3.第二个触发器将删除3。
祝好运。
不幸的是,Quartz.Net 2未发布,未记录,并引入了重大变化。
就像Aureliano和Bongo所说,触发器的组合可能有所帮助,但我不太了解他们各自的解决方案。
我的解决方案是包装一个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... }