Java 如何在前一个或下一个工作日运行Quartz计划程序

Java 如何在前一个或下一个工作日运行Quartz计划程序,java,jakarta-ee,quartz-scheduler,Java,Jakarta Ee,Quartz Scheduler,说明了如何将Quartz排除在特定日历日运行,但我需要的是一些不同的东西,如果触发日历在假日运行,我需要在前一个或下一个工作日运行作业 例如,假设作业计划每月运行一次,包括2019年3月29日星期五(节假日) 这意味着: 非假日:2019年3月28日星期四(如果作业运行,则应在该时间运行) 假期前) 假期:2019年3月29日星期五 假日:2019年3月30日星期六 假日:2019年3月31日星期日 非假日:2019年4月1日星期一(如果作业在假日后运行,则应在该时间运行) 实现这一点的一种

说明了如何将Quartz排除在特定日历日运行,但我需要的是一些不同的东西,如果触发日历在假日运行,我需要在前一个或下一个工作日运行作业

例如,假设作业计划每月运行一次,包括2019年3月29日星期五(节假日)

这意味着:

  • 非假日:2019年3月28日星期四(如果作业运行,则应在该时间运行) 假期前)
  • 假期:2019年3月29日星期五
  • 假日:2019年3月30日星期六
  • 假日:2019年3月31日星期日
  • 非假日:2019年4月1日星期一(如果作业在假日后运行,则应在该时间运行)
实现这一点的一种方法是每天运行作业,并分析该作业是否应在当天运行,必要时重新触发,但有更好的方法吗

更新


如果我必须每天触发作业,为什么不使用JavaEE8呢

我建议在每个工作日运行它,例如使用Cron表达式(在每个工作日的下午5点运行)


在Cron表达式调用的函数中,您可以调用holidayService.isHoliday(date),它将告诉您日期是否是假日。如果是假日,那么您可以跳过运行报告。

当我不得不安排第三个到最后一个工作日时,我遇到了类似的问题,经过一些研究,这是正确的字符串:

0 45 20 L-3W * ? *

“L-3W”的意思是“最后一个工作日(周一至周五)之前的第三个工作日”

我建议将Quartz Scheduler和业务逻辑分开,并基于Java中的逻辑触发作业。我无法理解在前一天运行作业?这意味着您每天都会触发作业,并使用Java的业务逻辑来查看它是否在当天运行?
作业计划在2019年3月29日星期五运行,但这是一个假日。
如果不需要运行,请不要安排它。它计划每月运行一次,我不想跳过工作,如果是假日,我想在前一个工作日或下一个工作日运行。这只是一个想法。如果是假日,你可以相应地安排或做任何你想做的事情。
0 45 20 L-3W * ? *