Quartz.net 每两周一次的 cron 触发表达式

Quartz.net cron trigger expression for every two week

我需要创建 cron 触发器,每个拖曳周 运行 的星期五

0 30 17 ? * FRI#2 *

是我设法创建的,但它仅在每个月的第二个星期五生成 运行s 的时间表。是否可以使用 Cron Expression 来实现我所需要的?

我听说 quartz.net 2.x 中有新的触发器类型,但找不到任何好的示例来在 XML 配置文件中配置它。我的意思是 CalendarIntervalTrigger 谁能帮助我如何获得想要的结果?

更新

            var trigger = TriggerBuilder.Create()
            .WithIdentity("InvoiceGenerator", "InvoiceGenerator")
            .StartNow()
            .WithSchedule(CalendarIntervalScheduleBuilder.Create().WithIntervalInWeeks(2)).Build();

这是我在 C# 端设法创建的(不幸的是没有 xml)但是当我在 trigger[=36= 上调用 GetNextFireTimeUtc 时] 它总是 returns null.

更新 感谢大家的回答,我想出的办法是创建正常的 cron 触发器,每个星期五 运行s 并在执行中检查天气两个星期最后 运行 是否通过了科学。

用c#是下面的代码片段。

        var friday = new DateTime(2015, 04, 10, 17, 30, 00);
        var trigger = TriggerBuilder.Create()
                .WithIdentity("InvoiceGenerator", "InvoiceGenerator")
                .WithCalendarIntervalSchedule(x => x.WithIntervalInWeeks(2))
                .WithDescription("trigger")
                .StartAt(friday)
                .Build();
        var nexRun = trigger.GetFireTimeAfter(friday);

nexRun 在这种情况下是正确的。 现在唯一剩下的就是找出我们可以使用 XML.

配置它的人

这无法通过 cron 表达式实现。您可以通过向您的 Quartz 作业添加三个触发器来接近,尽管它不能满足您对有五个星期五的月份的要求。

第一个触发器应在每个月的第一个星期五触发:

0 30 17 ? * FRI#1 *

第二个触发器应该在每个月的第三个星期五触发

0 30 17 ? * FRI#3 *

需要第三个触发器来处理有第五个星期五的月份:

0 30 17 ? * FRI#5 *

最后一个触发器并不完美,因为下一个 运行 将在一周后。

或者,您可以创建一个每周触发的 cron 表达式,Quartz 作业会检查上次触发时间,如果上次触发时间少于 14 天前则什么都不做。

这很容易通过一个触发器以编程方式完成。我不认为它可以通过单个 cron 表达式来完成。

        var friday = new DateTime(2015, 04, 02, 17, 30, 00)
        var trigger = TriggerBuilder.Create()
                .WithIdentity("InvoiceGenerator", "InvoiceGenerator")
                .WithCalendarIntervalSchedule(x => x.WithIntervalInWeeks(2))
                .WithDescription("trigger")
                .StartAt(friday) 
                .Build();

在我看来,您使用的是 RAMJobStore,在这种情况下,您的触发器保存在 quartz_jobs.xml 文件中。在XML中设置日历间隔确实可能。例如,上面的触发器将翻译如下:

<trigger>
  <calendar-interval>
    <name>calendarJobName</name>
    <group>calendarJobGroup</group>
    <description>CalendarTriggerDescription</description>
    <job-name>jobName1</job-name>
    <job-group>jobGroup1</job-group>
    <start-time>2015-04-02T17:30:00.0Z</start-time>
    <end-time>2099-04-02T17:30:00.0Z</end-time>
    <misfire-instruction>SmartPolicy</misfire-instruction>
    <repeat-interval>2</repeat-interval>
    <repeat-interval-unit>Week</repeat-interval-unit>
  </calendar-interval>
</trigger>

我通过为一周中的每一天创建多个作业,然后使用 CalendarIntervalScheduleBuilder 设置每周间隔来解决这个问题。不过,您必须手动计算下一个开始日期。

例如

For each DayOfWeek in MyDaysOfWeek
    StartDate = GetNextWeekDay(JobStartDate,DayOfWeek)
    Dim Sched = CalendarIntervalScheduleBuilder.Create().WithIntervalInWeeks(Interval).WithMisfireHandlingInstructionDoNothing()

    Dim JobTrigger = TriggerBuilder.Create().WithIdentity(JobTriggerName).
                            StartAt(StartDate).WithSchedule(Sched).EndAt(EndDate).Build()

     'Add to your scheduler here
next