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

时间:2015-04-08 21:09:31

标签: c# xml quartz.net

我需要创建每周两周运行的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);
在这种情况下,

nexRun是正确的。 现在唯一剩下的就是找出我们可以使用XML配置它的人。

3 个答案:

答案 0 :(得分:3)

使用一个触发器以编程方式执行此操作非常简单。我不认为它可以通过单个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>

答案 1 :(得分:2)

这不能用cron表达式实现。您可以通过在Quartz作业中添加三个触发器来实现,尽管它在五个星期五的几个月内不能满足您的要求。

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

0 30 17 ? * FRI#1 *

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

0 30 17 ? * FRI#3 *

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

0 30 17 ? * FRI#5 *

这最后一次触发并不完美,因为下一轮将在一周的时间内完成。

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

答案 2 :(得分:0)

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

E.g。

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