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