【问题标题】:How to run quartz job for every working days of month如何在每月的每个工作日运行石英作业
【发布时间】:2019-09-07 10:23:30
【问题描述】:

我需要运行一个需要运行每个月的第一个工作日的工作,我还需要删除假期并获得每个月的第一个工作日。

FE : 5 月 1 日是假期,所以工作需要在 5 月 2 日运行。

对于我在下面的代码中使用的其他工作。

 public CronTriggerFactoryBean testBean() {
    CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
    bean.setJobDetail(test().getObject());
    bean.setName("test");
    bean.setGroup("test");
    bean.setCronExpression("0 45 3 ? * *");
    return bean;
}

有没有办法解决这个问题?

【问题讨论】:

  • 我可能会写一个 bash 脚本来安排这个任务
  • 每个国家/地区都有自己的假期,所以首先,这取决于您希望在您的应用程序中使用哪个国家/地区。
  • @Dred 日子并不重要,它可能会改变。
  • 即使在一个特定的国家,地区之间也存在差异...... 5 月 1 日是汝拉 (CH) 的假期,而不是日内瓦 (CH)。
  • 假设我们使用美国假期,我们有解决问题的方法吗?

标签: java spring cron spring-batch quartz-scheduler


【解决方案1】:

CRON 不支持并且可能永远不会支持任何机制来识别当前或给定位置的假期。假期在国家之间不一致,有时甚至在各省之间(通常是地理大国)。

对于像 CRON is 这样简单易用的指定表达式,这个特性会非常复杂。

您可以做的唯一可能的事情是在周一至周五 (2-6) 的每一天触发,而不管假期如何,并在给定的工作中执行一些额外的假期检查。如果2-6MON-FRI 表达式不起作用,请使用2,3,4,5,6

bean.setCronExpression("0 45 3 ? * 2-6"); 
// At 03:45:00am, every day between Monday and Friday, every month
 

免责声明:CRON 的一周从星期日开始 (1)。

【讨论】:

    【解决方案2】:

    通过 cron 表达式实现该要求可能太复杂了。 我会使用周一到周五运行的 cron 表达式,例如。 g.

    0 3 45 * * MON-FRI

    并通过验证日期列表来检查当前日期是否是工作中的假期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 2010-12-13
      • 1970-01-01
      • 2013-10-20
      • 2012-01-11
      • 2020-05-13
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多