Quartz.NET,每x周重复一次

时间:2011-02-01 17:49:43

标签: c# cron quartz.net

我需要使用Quartz.NET实现以下场景:

每隔n周重复一次:
星期日和/或星期一,星期二,星期三,星期四,星期五,星期六......

例如,我可能会选择:星期一和星期四,每两周复发一次,这可能吗?

我认为可行的方法可能是使用Cron表达式,但到目前为止,我还没有运气“Recur Every X Weeks”

谢谢!

4 个答案:

答案 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个触发器进行管理;

  1. 触发2周样本cron:“0 0 0 1 *”
  2. 触发2周样本cron:“0 0 0 15 *”
  3. 触发trig选择天样本cron:“0 0 0?* SUN-SAT”
  4. 第一个触发器将创建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...
}