Quartz cron指定日期不存在时顺延执行的实现方案咨询
Quartz Cron 不存在指定日时自动适配最近有效日的实现方案
方案1:使用CalendarIntervalTrigger(无需自定义代码,完美匹配需求)
不需要用CronTrigger,直接用Quartz内置的CalendarIntervalTrigger就可以原生满足你的需求:
- 设置触发间隔单位为月,间隔时长为1
- 设置首次触发时间为任意一个有30日的月份的30日(比如2024-01-30 00:00:00)
- Quartz会自动处理月份天数不足的场景:当月有30日则30日触发,没有则自动落到当月最后一个有效自然日,完全匹配你举例的2月取28/29日、11月取30日的需求
- 代码示例:
CalendarIntervalTrigger trigger = newTrigger() .withIdentity("trigger1", "group1") .startAt(Date.from(LocalDate.of(2024,1,30).atStartOfDay(ZoneId.systemDefault()).toInstant())) .withSchedule(calendarIntervalSchedule() .withIntervalInMonths(1)) .forJob("job1", "group1") .build();
方案2:自定义TriggerListener(适配所有自定义规则)
如果你的适配规则更灵活,比如需要向前/向后偏移指定天数、或者按业务自定义逻辑计算最近有效日,通过自定义监听器实现即可:
- 实现
TriggerListener接口,重写triggerFired方法,在方法内校验当前触发月份是否存在目标执行日 - 若不存在目标日期,计算符合规则的最近有效日,调整触发器的下一次触发时间
- 将自定义监听器注册到Scheduler实例,绑定到对应任务的触发器上即可
两种方案对比
CalendarIntervalTrigger方案:无额外开发成本,性能无损耗,完美匹配指定日期缺省取最近月末的通用需求- 自定义监听器方案:可完全自定义适配规则,仅需新增几十行代码,无明显性能损耗
内容的提问来源于stack exchange,提问作者Leah
相关产品推荐
相关产品推荐

