2017-05-09 4 views
1

Ich schrieb einen Scheduler@Scheduled ohne Angabe eines genauen Datum

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

} 

Was immer um Mitternacht bedeutet. Der Vorgang dauert ca. 4 Stunden. (0 am-4am)

Jetzt gibt es am 28.07.2017 um 13:00 Uhr einen Wartungstag.

Ich entschied mich, Daten zu diesem Datum nicht zu kopieren, um keinen unerwarteten Zustand zu haben. Wie kann dieses Datum von der Ausführung ausgeschlossen werden?

+0

@Zeromus Gibt es so etwas wie eine @ NonScheduled-Annotation? Oder ein Incode-Vorschlag? –

Antwort

1

Cron unterstützt den Ausschluss nicht. Schnellste i einfiel ist eine doppelte @scheduled Anmerkung wie dieser

@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 

(versuchte zunächst mit Minuten mit so etwas wie dies, und es scheint für mich

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

zu arbeiten)

Definitiv nicht elegant aber

+1

Eine grausame Art von genial! –

0

Die Cron-Syntax scheint den Ausschluss eines bestimmten Datums nicht zu unterstützen. Siehe this answer aus der Unix und Linux Stack Website:

Standard-Cron Syntax recht einfach ist, ist es nicht Ausschlüsse nicht unterstützt. In einigen Fällen ist es möglich, eine Liste von mehreren/vielen Cron-Einträgen zu erstellen, um eine solche Logik zu implementieren, aber das ist mühsam und schwer zu verstehen oder zu pflegen; Dieser Ansatz ist jedoch in Ihrem Fall nicht anwendbar (nicht zuletzt, weil Standard-Cron keine Vorstellung vom Kalenderjahr hat).

Ich kann über ein paar wenige Lösungen für Ihr Problem denken:

  • die Logik durch die bedingten Timer ausgeführt Stellen, wie in this answer beschrieben. Sie könnten eine boolesche Eigenschaft haben, die bestimmt, ob die Logik ausgeführt werden soll oder nicht. Der Timer wird leider immer noch ausgelöst, aber Sie können die Eigenschaft verwenden, um ihre Logik nicht auszuführen.
  • Eine etwas ausgefeiltere Lösung wäre die gleiche wie oben, behalte aber eine Liste von Daten, für die die Ausführung deaktiviert werden soll.
  • Noch einfacher, aber viel weniger anspruchsvoll, fügen Sie den Ausschluss des Datums direkt zum Code hinzu: if (!LocalDate.now().equals(LocalDate.of(2017, 7, 28))). Je nach Art der Anwendung kann dies akzeptabel sein.
  • Eine vierte Option wäre, den Scheduler programmatisch zu erstellen. Sie können HolidayCalendar von der Quartz-API verwenden, um das Datum auszuschließen. Es hat eine Methode addExcludedDate(Date date), die genau das tut, was Sie wollen. Ein vollständiges Beispiel mit Spring ist in this preview of an E-book verfügbar. Ich bin nicht sicher, ob ich das Beispiel kopieren darf, also poste ich nur den Link.
0

Prinzipiell kann ein CMMS nach geplanten Wartungsbereichen in Code gefragt werden.

Verwandte Themen