Die @ geplante Annotation im Frühjahr

1. Übersicht

In diesem Lernprogramm wird veranschaulicht, wie die Annotation Spring @Scheduled zum Konfigurieren und Planen von Aufgaben verwendet werden kann.

Die einfachen Regeln, die wir befolgen müssen, um eine Methode mit @Scheduled zu kommentieren, sind:

  • Eine Methode sollte den Rückgabetyp void haben
  • Eine Methode sollte keine Parameter akzeptieren

2. Aktivieren Sie die Unterstützung für die Zeitplanung

Um die Unterstützung für Planungsaufgaben und die Annotation @Scheduled im Frühjahr zu aktivieren , können Sie die Annotation im Java-Aktivierungsstil verwenden:

@Configuration @EnableScheduling public class SpringConfig { ... }

Umgekehrt können wir dasselbe in XML tun:

3. Planen Sie eine Aufgabe mit fester Verzögerung

Beginnen wir mit der Konfiguration einer Aufgabe, die nach einer festgelegten Verzögerung ausgeführt werden soll:

@Scheduled(fixedDelay = 1000) public void scheduleFixedDelayTask() { System.out.println( "Fixed delay task - " + System.currentTimeMillis() / 1000); }

In diesem Fall ist die Dauer zwischen dem Ende der letzten Ausführung und dem Beginn der nächsten Ausführung festgelegt. Die Aufgabe wartet immer, bis die vorherige beendet ist.

Diese Option sollte verwendet werden, wenn die vorherige Ausführung abgeschlossen sein muss, bevor sie erneut ausgeführt wird.

4. Planen Sie eine Aufgabe mit einer festen Rate

Lassen Sie uns nun eine Aufgabe in einem festgelegten Zeitintervall ausführen:

@Scheduled(fixedRate = 1000) public void scheduleFixedRateTask() { System.out.println( "Fixed rate task - " + System.currentTimeMillis() / 1000); }

Diese Option sollte verwendet werden, wenn jede Ausführung der Aufgabe unabhängig ist.

Beachten Sie, dass geplante Aufgaben standardmäßig nicht parallel ausgeführt werden. Selbst wenn wir fixedRate verwendet haben , wird die nächste Aufgabe erst aufgerufen, wenn die vorherige erledigt ist.

Wenn wir paralleles Verhalten bei geplanten Aufgaben unterstützen möchten, müssen wir die Annotation @Async hinzufügen :

@EnableAsync public class ScheduledFixedRateExample { @Async @Scheduled(fixedRate = 1000) public void scheduleFixedRateTaskAsync() throws InterruptedException { System.out.println( "Fixed rate task async - " + System.currentTimeMillis() / 1000); Thread.sleep(2000); } }

Jetzt wird diese asynchrone Aufgabe jede Sekunde aufgerufen, auch wenn die vorherige Aufgabe nicht erledigt ist.

5. Feste Rate gegen feste Verzögerung

Wir können eine geplante Aufgabe mithilfe der @ Scheduled- Annotation von Spring ausführen , aber basierend auf den Eigenschaften fixedDelay und fixedRate ändert sich die Art der Ausführung.

Die Eigenschaft fixedDelay stellt sicher, dass zwischen der Endzeit einer Ausführung einer Aufgabe und der Startzeit der nächsten Ausführung der Aufgabe eine Verzögerung von n Millisekunden liegt.

Diese Eigenschaft ist besonders nützlich, wenn wir sicherstellen müssen, dass immer nur eine Instanz der Aufgabe ausgeführt wird. Für abhängige Jobs ist es sehr hilfreich.

Die Eigenschaft fixedRate führt die geplante Aufgabe alle n Millisekunden aus. Es wird nicht nach früheren Ausführungen der Aufgabe gesucht.

Dies ist nützlich, wenn alle Ausführungen der Aufgabe unabhängig sind. Wenn wir nicht erwarten, die Größe des Speichers und des Thread-Pools zu überschreiten, sollte fixedRate sehr praktisch sein.

Wenn die eingehenden Aufgaben nicht schnell erledigt werden, kann es jedoch vorkommen, dass die Ausnahme "Nicht genügend Speicher" vorliegt.

6. Planen Sie eine Aufgabe mit anfänglicher Verzögerung

Als nächstes planen wir eine Aufgabe mit einer Verzögerung (in Millisekunden):

@Scheduled(fixedDelay = 1000, initialDelay = 1000) public void scheduleFixedRateWithInitialDelayTask() { long now = System.currentTimeMillis() / 1000; System.out.println( "Fixed rate task with one second initial delay - " + now); }

Beachten Sie, wie wir in diesem Beispiel sowohl fixedDelay als auch initialDelay verwenden . Die Task wird beim ersten Mal nach dem Wert für initialDelay ausgeführt und weiterhin gemäß dem Wert für fixedDelay ausgeführt .

Diese Option ist praktisch, wenn die Aufgabe über ein Setup verfügt, das abgeschlossen werden muss.

7. Planen Sie eine Aufgabe mit Cron Expressions

Manchmal reichen Verzögerungen und Raten nicht aus, und wir benötigen die Flexibilität eines Cron-Ausdrucks, um den Zeitplan unserer Aufgaben zu steuern:

@Scheduled(cron = "0 15 10 15 * ?") public void scheduleTaskUsingCronExpression() { long now = System.currentTimeMillis() / 1000; System.out.println( "schedule tasks using cron jobs - " + now); }

Beachten Sie, dass wir in diesem Beispiel eine Aufgabe planen, die am 15. eines jeden Monats um 10.15 Uhr ausgeführt wird.

Standardmäßig verwendet Spring die lokale Zeitzone des Servers für den Cron-Ausdruck. Allerdings können wir die Verwendung Zone Attribut diese Zeitzone zu ändern :

@Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris")

Mit dieser Konfiguration plant Spring, dass die mit Anmerkungen versehene Methode am 15. eines jeden Monats in Paris um 10.15 Uhr ausgeführt wird.

8. Parametrieren des Zeitplans

Das Hardcodieren dieser Zeitpläne ist einfach, aber normalerweise müssen wir in der Lage sein, den Zeitplan zu steuern, ohne die gesamte App neu zu kompilieren und erneut bereitzustellen.

Wir werden Spring Expressions verwenden, um die Konfiguration der Aufgaben zu externalisieren, und diese in Eigenschaftendateien speichern.

Eine FixedDelay- Aufgabe:

@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")

Eine FixedRate- Aufgabe:

@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")

Eine auf Cron- Ausdrücken basierende Aufgabe:

@Scheduled(cron = "${cron.expression}")

9. Geplante Aufgaben mit XML konfigurieren

Spring bietet auch eine XML-Methode zum Konfigurieren der geplanten Aufgaben. Hier ist die XML-Konfiguration, um diese einzurichten:

10. Schlussfolgerung

In diesem Artikel haben wir die Konfiguration und Verwendung der Annotation @Scheduled erläutert .

Wir haben den Prozess zur Aktivierung der Planung und verschiedene Möglichkeiten zur Konfiguration von Planungsaufgabenmustern behandelt.

Die oben gezeigten Beispiele finden Sie auf GitHub.