我需要使用Quartz.NET实现以下场景:
每隔n周重复一次:
星期日和/或星期一,星期二,星期三,星期四,星期五,星期六......
例如,我可能会选择:星期一和星期四,每两周复发一次,这可能吗?
我认为可行的方法可能是使用Cron表达式,但到目前为止,我还没有运气“Recur Every X Weeks”
谢谢!
答案 0 :(得分:7)
您正在运行Quartz.Net 2.0和选项吗?它尚未正式发布,但在其中有一种新的触发类型可以解决您的问题。它被称为日历间隔触发器。基本上你就像你在问题中描述的那样定义它。您将间隔设置为2,将间隔单位设置为周,并且每2周触发一次。我写过一篇描述它的帖子here。您可以访问源代码文档here。
答案 1 :(得分:6)
这是我用过的解决方案......
当没有复发时,我使用cron触发器并选择日期并使其每周运行
E.G。 0 0 * * 1,2,3
当每个选定日都有复发时,我会添加一个SimpleTrigger,低音开始日期是星期几,然后我通过乘以7的复发来计算复发次数
所以我每天最终都会遇到一个简单的触发器。
我希望这有助于其他人!
答案 2 :(得分:3)
它是一个Complext触发器,你可以通过3个触发器进行管理;
第一个触发器将创建3。 第二次触发将删除3.
祝你好运。答案 3 :(得分:0)
不幸的是,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...
}