在本文中,解释了如何将 Quartz 排除在特定日历日的运行之外,但我需要的是不同的东西,如果触发日历在假期结果,我需要在上一个或下一个工作日运行作业。
例如,假设作业计划每月运行一次,包括 2019 年 3 月 29 日星期五(节假日)。
这意味着:
- 非假日:2019 年 3 月 28 日星期四(如果作业正在运行,则作业应运行的时间 节前)
- 假日:2019年3月29日,星期五
- 假日:2019年3月30日(星期六 )
- 假日:2019年3月31日星期日
- 非假日:2019 年 4 月 1 日星期一(如果作业在节假日后运行,则应在作业上运行)
实现此目的的一种方法是每天运行作业并分析它是否应该在那天运行,并在必要时重新触发,但是有更好的方法吗?
更新
如果我必须每天触发作业,为什么不使用 Java EE 8 TimerService呢?
例如,我建议在每个工作日使用 Cron 表达式运行它(每个工作日下午 5 点运行)
0 00 17 * * MON-FRI
在由 Cron 表达式调用的函数中,您可以调用 holidayService.isHoliday(date),这将判断日期是否为假期。如果是假日,则可以跳过运行报告。
当我不得不安排倒数第三个工作日时,我遇到了类似的问题,经过一些研究,事实证明这是正确的字符串:
0 45 20 L-3W * ? *
">L-3W"的意思是"上个工作日(周一至周五)之前的第三个">