2017-07-10 66 views
1

使用Quartz.NET,我试图创建一个触发器:Quartz.net - 在每m个月的第n天重复一次?

  1. 开始9月30日
  2. 重复的最后一天
  3. 每5个月
  4. 能够使用ITrigger.GetFireTimeAfter()计算/项目下一点火时间(UI反馈)

预计:

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

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

但预计天数为:

  • 二零一七年九月三十日
  • 2018年9月30日
  • 2019年9月30日

无法使用CalendarIntervalTrigger之一:

例如,如果你选择的是1月31日发生的开始时间,并与单位月和间隔1触发,那么接下来的发射时间将是2月28日,之后,下一次将在3月28日 - 和基本上每个后续的射击都会在本月28日发生,即使第31天存在。如果你想有一个触发器,始终闪光在每月的最后一天 - 在一个月不管天数的,你应该使用ICronTrigger

Quartz.NET documentation

我怎么能安排这样的扳机?我是否必须从头开始实施自己的触发器和IScheduler?或者有没有办法让我在自定义计算中注入?

感谢

+1

它不是我所有尝试过的东西,但可能使用Cron表达式0 0 0 L */5? *与ModifiedByCalendar和一些CronCalenders一起排除2017年7,8,10,11,12和2018年1,3,4,5,6,8,9,10,11等。 – sgmoore

回答

1

这不是cron表达式是如何运作的方式。通过定义为“9/5”,你只是“5月icrement”表示“开始于九月”,但并没有第十四个月。每个月超过几个月计数将被切断,例如1/5将评估为“一月”,然后“六月”,最后评估为“十一月”。另一个尝试将溢出数月计数和cron将从开始。所以它将从另一个“一月”开始,然后是“六月”,最后是“十一月”。再看表达,它是否会工作像你想,那就不适合表达在明年becouse例如1/5将在“月”进行评估

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

这是错了! becouse月不适合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

相关问题