@Scheduled没有具体日期

时间:2017-05-09 07:15:16

标签: java spring cron scheduler

我写了一个调度程序

ArrayList

每个午夜都意味着什么。这个过程大约需要4个小时。 (0 am-4am)

现在有一个维持日,于2017年7月28日下午1点开始。

我决定不在此日期复制数据以避免意外状态。如何从执行中排除这个日期?

3 个答案:

答案 0 :(得分:1)

Cron不支持排除。 我能想到的最快的是像这样的双重@scheduled注释

@Scheduled(cron = "0 0 0 * 1-6,8-12 *")  //every month except 7
@Scheduled(cron = "0 0 0 1-27,29-31 7 *") //every day of month 7 except 28

(首先尝试用这样的东西分钟,这似乎对我有用

@Scheduled(cron = "00 1-20,25-59 * * * *") //every minute except 21,22,23,24 for every hour
@Scheduled(cron = "00 21 10 * * *") //minute 21 for 10 am (dunno your timezone)

虽然

绝对不优雅

答案 1 :(得分:0)

cron语法似乎不支持排除特定日期。请参阅Unix和Linux StackExchange站点中的this answer

  

标准cron语法非常简单,它不支持排除。在某些情况下,可以创建一个包含几个/多个cron条目的列表来实现这样的逻辑,但这往往是单调乏味且难以理解或维护的;这种方法不适用于您的情况(尤其是因为标准cron没有日历年的概念)。

我可以为您的问题考虑几个解决方案:

  • 使计时器执行的逻辑有条件,如this answer中所述。你可以有一个布尔属性来确定逻辑是否应该执行。遗憾的是,计时器仍会触发,但您可以使用该属性不执行其逻辑。
  • 一个更复杂的解决方案与上面的相同,但保留一个日期列表,以禁用执行。
  • 更简单,但更不复杂,直接将日期排除在代码中:if (!LocalDate.now().equals(LocalDate.of(2017, 7, 28)))。根据应用程序的类型,这可能是可以接受的。
  • 第四个选项是以编程方式创建调度程序。您可以使用Quartz API中的HolidayCalendar来排除日期。它有一个方法addExcludedDate(Date date),它完全符合你的要求。使用Spring的完整示例可在this preview of an E-book中找到。我不确定是否允许复制示例,因此我只发布链接。

答案 2 :(得分:0)

原则上,CMMS可以在代码中被要求提供计划的维护范围。