每两周使用一次Quartz.net cron触发器表达式



我需要创建cron触发器,该触发器在每两周的周五运行

0 30 17 ? * FRI#2 *

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

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

更新

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

这是我设法在c#端创建的(不幸的是没有xml),但当我在触发器上调用GetNextFireTimeUtc时,它总是返回null。

更新感谢大家的回答,我设法想出的是,要么创建每周五运行的正常cron触发器,要么在执行检查中,两周后是否通过了上次运行的科学测试。

对于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);

nextRun在这种情况下是正确的。现在唯一剩下的就是弄清楚谁可以使用XML配置它。

用一个触发器通过编程实现这一点相当简单。我不认为这可以通过一个单独的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>

这是用cron表达式无法实现的。你可以在Quartz的工作中添加三个触发器,尽管它在五个星期五的几个月内都不能满足你的要求。

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

0 30 17 ? * FRI#1 *

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

0 30 17 ? * FRI#3 *

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

0 30 17 ? * FRI#5 *

最后一次触发并不完美,因为下一次跑步将在一周后进行。

或者,您可以创建一个cron表达式,该表达式每周都会触发,Quartz作业会检查上次触发时间,如果上次触发时间不到14天前,则不执行任何操作。

我通过为一周中的每一天创建多个作业,然后使用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

最新更新