fixedRate: Es wird verwendet, um die Job-Methode alle n Millisekunden auszuführen. Es ist nicht wichtig, ob der Job seine vorherige Aufgabe bereits beendet hat.
fixedDelay: Es wird verwendet, um die Job-Methode sequenziell mit den angegebenen n Millisekunden Wartezeit zwischen den Aufgaben auszuführen.
Wann sollte "fixedRate" verwendet werden: FixedRate ist geeignet, wenn nicht erwartet wird, dass die Größe des Arbeitsspeichers und des Threadpools überschritten wird. Wenn die eingehenden Aufgaben nicht schnell beendet werden, kann dies zu einer "Nicht genügend Speicher-Ausnahme"
führenWann sollte "fixedDelay" verwendet werden: Wenn jede laufende Aufgabe füreinander relevant ist und sie warten müssen, bevor die vorherige abgeschlossen ist, ist fixedRate geeignet. Wenn die FixedDelay-Zeit sorgfältig eingestellt ist, wird den laufenden Threads genügend Zeit gelassen, ihre Jobs zu beenden, bevor die neue Task gestartet wird.
"fixedRate": wartet auf X millis vom Beginn der vorherigen Ausführung an, bevor die nächste Ausführung beginnt. Wenn die aktuelle Ausführung das Intervall 'fixedRate' überschreitet, wird die nächste Ausführung in die Warteschlange gestellt, aber nur die nächste. Es wird keine Serie von Ausführungen in der Warteschlange erstellt.
%Vor%Ausgabe:
Gestartet: 1
Abschluss: 1 // nach 4 Sekunden
Started: 2 // sofort ohne Warten auf 1 Sekunde, wie in der festen Rate angegeben Abschluss: 2 // nach 4 Sekunden
und so weiter
"fixedDelay": wartet auf X millis vom Ende der vorherigen Ausführung, bevor die nächste Ausführung gestartet wird. Unabhängig davon, wie viel Zeit die aktuelle Ausführung in Anspruch nimmt, wird die nächste Ausführung nach dem Hinzufügen des Intervalls "fixedDelay" zur Endzeit der aktuellen Ausführung gestartet. Die nächste Ausführung wird nicht in die Warteschlange gestellt.
%Vor%Ausgabe:
Gestartet: 1
Beendet: 1 // nach 4 Sekunden 2 // wartet 1 Sekunde wie in fixedDelay angegeben Abschluss: 2 // nach 4 Sekunden Gestartet: 3 // nach 1 Sekunde
und so weiter
Feste Verzögerung : Bestimmt die nächste Ausführungszeit, wenn die letzte Ausführung beendet ist.
Feste Rate : veranlasst, dass Spring die Aufgabe in regelmäßigen Intervallen ausführt, auch wenn der letzte Aufruf möglicherweise noch läuft.
Eine Sache, die geklärt werden sollte, ist, dass fixedRate
nicht bedeutet, dass Ausführungen mit einem bestimmten Zeitintervall beginnen.
Wenn eine Ausführung zu viel Zeit kostet (mehr als die feste Rate), wird die nächste Ausführung erst NACH beginnen, wenn die vorherige Ausführung abgeschlossen ist, es sei denn, @Async
und @EnableAsync
werden bereitgestellt. Die folgenden Quellcodes, die Teil der Spring ThreadPoolTaskScheduler
Implementierung sind, erklären warum:
Sie können sehen, dass erst nach Abschluss der vorherigen Aufgabe ( super.run()
) die nächste Aufgabe geplant ist ( schedule()
). Mit @Async
und @EnableAsync
ist super.run()
eine asynchrone Funktion, die sofort zurückkehrt, so dass die nächste Aufgabe nicht darauf warten muss, dass die vorherige tatsächlich beendet wird.
Tags und Links java spring scheduled-tasks