Java @没有具体日期的计划
我写了一个调度程序Java @没有具体日期的计划,java,spring,cron,scheduler,Java,Spring,Cron,Scheduler,我写了一个调度程序 @Documented @Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Scheduled(cron="0 0 0 * * *") public @interface DeleteAndCopy{ } 每到午夜意味着什么。这个过程大约需要4个小时。(上午0点至4点) 现在有一个维护日,2017年7月28日下午1:00 我决定在此日期不复制数据,以避免出现意外状态。如何从执行中排除此日
@Documented
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Scheduled(cron="0 0 0 * * *")
public @interface DeleteAndCopy{
}
每到午夜意味着什么。这个过程大约需要4个小时。(上午0点至4点)
现在有一个维护日,2017年7月28日下午1:00
我决定在此日期不复制数据,以避免出现意外状态。如何从执行中排除此日期?cron语法似乎不支持排除特定日期。请参阅Unix和Linux StackExchange站点: 标准cron语法非常简单,它不支持排除。在某些情况下,可以创建多个/多个cron条目的列表来实现这种逻辑,但这往往很繁琐,难以理解或维护;但这种方法不适用于您的情况(尤其是因为标准cron没有日历年的概念) 我可以为您的问题想出几个解决方案:
- 使计时器执行的逻辑有条件,如中所述。您可以有一个布尔属性来确定逻辑是否应该执行。不幸的是,计时器仍将触发,但您可以使用该属性不执行其逻辑
- 更复杂一点的解决方案与上面相同,但保留一个禁用执行的日期列表
- 更简单但不复杂的是,将日期排除直接添加到代码中:
。根据应用程序的类型,这可能是可以接受的if(!LocalDate.now().equals(LocalDate.of(2017,7,28))
- 第四个选项是以编程方式创建调度器。您可以从Quartz API中使用来排除日期。它有一种方法,可以完全满足您的需求。中提供了使用Spring的完整示例。我不确定我是否可以复制这个例子,所以我只发布链接
@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)
)
虽然原则上CMMS可以在代码中要求有计划的维护范围,但绝对不优雅 @Zeromus是否有类似于@NonScheduled注释的内容?还是一个Incode建议?一种残忍的独创性!