我需要创建每周两周运行的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配置它的人。
答案 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