2017-05-09 2 views
1

j'ai écrit un planificateur@Scheduled sans date précise

@Documented 
@Target({ ElementType.METHOD }) 
@Retention(RetentionPolicy.RUNTIME) 
@Scheduled(cron="0 0 0 * * *") 
public @interface DeleteAndCopy{ 

} 

Ce qui signifie que chaque minuit. Le processus prend environ 4 heures. (0 am-4am)

Il y a maintenant un jour de maintenance le 28.07.2017 à 13h00.

J'ai décidé de ne pas copier les données à cette date pour ne pas avoir un état inattendu. Comment exclure cette date de l'exécution?

+0

@Zeromus Y a-t-il quelque chose comme un @ NonScheduled-Annotation? Ou une suggestion d'Incode? –

Répondre

1

Cron ne prend pas en charge l'exclusion. le plus rapide que je pourrais trouver est une double annotation @scheduled comme celui-ci

@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 

(d'abord essayé avec minutes avec quelque chose comme ça et il semble fonctionner pour moi

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

)

Certainement pas élégant si

+1

Un genre cruel d'ingénieux! –

0

La syntaxe cron ne semble pas prendre en charge l'exclusion d'une date spécifique. Voir this answer à partir du site Unix and Linux StackExchange:

La syntaxe cron standard est assez simple, elle ne prend pas en charge les exclusions. Dans certains cas, il est possible de créer une liste de plusieurs/plusieurs entrées cron pour implémenter une telle logique, mais cela tend à être fastidieux et difficile à comprendre ou à maintenir; cette approche n'est cependant pas applicable dans votre cas (notamment parce que cron standard n'a aucune notion de l'année civile).

je peux penser à un couple de quelques solutions pour votre problème:

  • Faire la logique exécutée par la minuterie conditionnelle, tel que décrit dans this answer. Vous pouvez avoir une propriété booléenne qui détermine si la logique doit s'exécuter ou non. La minuterie sera malheureusement encore déclenchée, mais vous pouvez utiliser la propriété pour ne pas exécuter sa logique.
  • Une solution un peu plus sophistiquée serait la même que ci-dessus, mais gardez une liste de dates pour lesquelles désactiver l'exécution.
  • Encore plus simple, mais beaucoup moins sophistiqué, ajoutez l'exclusion de la date directement au code: if (!LocalDate.now().equals(LocalDate.of(2017, 7, 28))). Selon le type d'application, cela peut être acceptable.
  • Une quatrième option consisterait à créer par programmation le planificateur. Vous pouvez utiliser HolidayCalendar à partir de l'API Quartz pour exclure la date. Il a une méthode addExcludedDate(Date date) qui fait exactement ce que vous voulez. Un exemple complet, en utilisant Spring, est disponible en this preview of an E-book. Je ne suis pas sûr si je suis autorisé à copier l'exemple, donc je publie seulement le lien.
0

Par principe, un GMAO peut être demandé pour les étendues de maintenance planifiées en code.