我需要创建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