Quartz.net – 每隔m个月在第n天重复一次?
使用Quartz.NET,我正在尝试创建一个触发器:
- 从9月30日开始,
- 在最后一天重复
- 每5个月一次 。
- 能够使用
ITrigger.GetFireTimeAfter()
来计算/投射下一个火灾时间(UI反馈)
预期:
- 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文档
我该如何安排这样的触发器? 我是否必须从头开始实现自己的触发器和IScheduler? 或者有没有办法让我注入自定义计算?
谢谢
这不是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评估器。 如果你环顾四周,你可以找到我是作者的库,它实现了小域专用语言,应该更适合你想做的事情。 我在这里描述: 评估复杂的时间模式