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的完整示例。我不确定我是否可以复制这个例子,所以我只发布链接

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)
)


虽然原则上CMMS可以在代码中要求有计划的维护范围,但绝对不优雅

@Zeromus是否有类似于@NonScheduled注释的内容?还是一个Incode建议?一种残忍的独创性!