Die @ geplante Annotation im Frühling

Die @Scheduled Annotation im Frühjahr

1. Überblick

In diesem Artikel werden wirthe Spring @Scheduled annotation diskutieren. Wir werden veranschaulichen, wie damit Aufgaben konfiguriert und geplant werden können.

Die einfachen Regeln, die befolgt werden müssen, um eine Methode mit@Scheduled zu versehen, sind:

  • Eine Methode sollte den Rückgabetyp void haben

  • Eine Methode sollte keine Parameter akzeptieren

Weitere Lektüre:

So wird @Async im Frühjahr ausgeführt

Aktivieren und Verwenden von @Async in Spring - von der sehr einfachen Konfiguration und grundlegenden Verwendung bis hin zu komplexeren Ausführern und Ausnahmebehandlungsstrategien.

Read more

Eine Anleitung zum Spring Task Scheduler

Eine schnelle und praktische Anleitung zur Planung im Frühjahr mit dem Taskplaner

Read more

Scheduling im Frühjahr mit Quarz

Schnelle Einführung in die Arbeit mit Quarz im Frühjahr.

Read more

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

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

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

Oder wir können 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 Task 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

Führen wir nun eine Aufgabe in einem festgelegten Zeitintervall aus:

@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 wirfixedRate 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@Asynchinzufü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 mit der Annotation@Scheduledvon Spring ausführen, aber basierend auf den EigenschaftenfixedDelay undfixedRate ändert sich die Art der Ausführung.

Die EigenschaftfixedDelay stellt sicher, dass zwischen der Endzeit einer Ausführung einer Aufgabe und der Startzeit der nächsten Ausführung der Aufgabe eine Verzögerung vonn Millisekunde liegt.

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

The fixedRate property runs the scheduled task at every n millisecond. 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, dass die Größe des Speichers und des Thread-Pools überschritten wird, solltenfixedRate sehr praktisch sein.

Wenn die eingehenden Aufgaben jedoch nicht schnell erledigt werden, wird möglicherweise die Ausnahme "Nicht genügend Speicher" angezeigt.

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

Weiter - Planen Sie 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 sowohlfixedDelayals auchinitialDelayverwenden. Die Aufgabe wird ein erstes Mal nach dem Wert voninitialDelayausgeführt - und sie wird weiterhin gemäß dem Wert vonfixedDelayausgeführt.

Diese Option ist praktisch, wenn für die Aufgabe eine Einrichtung erforderlich ist, die 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);
}

Hinweis - In diesem Beispiel planen wir, dass eine Aufgabe am 15. eines jeden Monats um 10:15 Uhr ausgeführt wird.

8. Zeitplanung parametrieren

Das Hardcodieren dieser Zeitpläne ist einfach. In der Regel müssen Sie jedoch in der Lage sein, den Zeitplan zu steuern, ohne die gesamte App erneut zu kompilieren und bereitzustellen.

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

AfixedDelay Aufgabe:

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

AfixedRate Aufgabe:

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

Die ausdrucksbasierte Aufgabe von Acron:

@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. Fazit

In diesem Artikel haben wir den Weg zuconfigure and use the @Scheduled annotation verstanden.

Wir haben den Prozess behandelt, um die Zeitplanung und verschiedene Möglichkeiten zum Konfigurieren von Zeitplanungsaufgabenmustern zu ermöglichen.

Die gezeigten Beispiele sindover on GitHub.