Quartz.net - 每隔m个月在第n天重复一次?

时间:2017-07-10 07:18:38

标签: c# cron quartz.net

使用Quartz.NET,我正在尝试创建一个触发器:

  1. 开始 9月30日
  2. 最后一天重复
  3. 每5个月
  4. 能够使用ITrigger.GetFireTimeAfter()来计算/投射下一次开火时间(UI反馈)
  5. 预期:

    • 2017年9月30日
    • 2018年2月28日
    • 2018年7月31日
    • 2018年12月31日

    我以为我可以使用CronTrigger(即0 0 0 L 9/5 ? *

    但预计的日子是:

    • 2017年9月30日
    • 2018年9月30日
    • 2019年9月30日

    无法使用CalendarIntervalTrigger

      

    例如,如果您选择1月31日发生的开始时间,并且具有单位月和间隔1的触发器,那么下一个开火时间将是2月28日,下一次开始时间将是3月28日 - 基本上每个后续的射击将在本月28日发生,即使存在第31天。如果您想要一个始终在该月的最后一天触发的触发器 - 无论该月的天数如何,您都应该使用ICronTrigger

    Quartz.NET documentation

    如何安排这样的触发器?我是否必须从头开始实现自己的触发器和IScheduler?或者我有办法注入自定义计算吗?

    由于

1 个答案:

答案 0 :(得分:1)

这不是cron表达式的工作方式。通过定义它“9/5”你刚刚表达“从9月开始”和“5个月的icrement”,但没有第14个月。超过月数的每个月将被削减,例如1/5将评估为“1月”然后“6月”,最后评估为“11月”。另一个尝试将溢出数月计数,而cron将从开始时开始。所以它将从另一个“1月”开始,然后是“6月”,最后是“11月”。看一下表达式,如果它能像你想要的那样工作,它就不适合下一年的表达式,因为例如1/5将在“四月”中进行评估

1/5 => January (2017) +5
1/5 => June (2017) +5
1/5 => November (2017) +5
1/5 => April (2018) +5

错误!因为四月不适合 1/5

这是正确的行为:

1/5 => January (2017) +5
1/5 => June (2017) +5
1/5 => November (2017) +5
1/5 => January (2018) +5
1/5 => June (2018)
... 

您真正需要的是以不同方式工作的工具。我认为没有办法迫使Quartz.NET Cron按你的意愿工作。唯一的方法是用不同的东西“替换”Quartz.NET cron评估器。如果你环顾四周,你可以找到我作为作者的库,它实现了小域专用语言,应该更适合你想做的事情。我在这里描述了它:Evaluate complex time patterns