我写了一个调度程序
ArrayList
每个午夜都意味着什么。这个过程大约需要4个小时。 (0 am-4am)
现在有一个维持日,于2017年7月28日下午1点开始。
我决定不在此日期复制数据以避免意外状态。如何从执行中排除这个日期?
答案 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没有日历年的概念)。
我可以为您的问题考虑几个解决方案:
if (!LocalDate.now().equals(LocalDate.of(2017, 7, 28)))
。根据应用程序的类型,这可能是可以接受的。HolidayCalendar
来排除日期。它有一个方法addExcludedDate(Date date)
,它完全符合你的要求。使用Spring的完整示例可在this preview of an E-book中找到。我不确定是否允许复制示例,因此我只发布链接。答案 2 :(得分:0)
原则上,CMMS可以在代码中被要求提供计划的维护范围。