Hintergrund
Während der Projektentwicklung müssen wir häufig regelmäßige Aufgaben ausführen. Es kann uns helfen, es durch Zeitaufgaben gut zu erreichen.
Vergleichen wir mehrere häufig verwendete zeitgesteuerte Task -Frameworks:
Wie aus der obigen Tabelle ersichtlich ist, verfügt das Frühlingsplan -Framework über vollständige Funktionen und ist einfach und einfach zu bedienen. Der Frühlingsplan ist für kleine und mittelgroße Projekte vollständig qualifiziert.
1. Zeitplan für Springboot -Integration
1.1 Hinzufügen von Maven -Abhängigkeitspaket
Da der Frühlingsplan im Grundmodul für Spring-Boot-Starter enthalten ist, sind keine zusätzlichen Abhängigkeiten erforderlich.
<Depelencies> <Deponcy> <gruppe> org.springFramework </abhängig> </Abhängigkeiten>
1.2 Startklasse, Annotation für Startups hinzufügen
Durch das Hinzufügen der @EnlablesDuling -Annotation zum Springboot -Eintrag oder zur Konfigurationsklasse können Timing -Aufgaben aktiviert werden.
@EnableScheduling@SpringBootApplicationPublic Class ScheduleApplication {public static void main (String [] args) {Springapplication.run (ScheduleApplication.class, args);}}1.3. Fügen Sie zeitgesteuerte Aufgaben hinzu
Wir werden Beispiele für die drei Aufgabenplaner des Frühlingsplanes geben.
1.3.1 Cron -Ausdrücke
Ähnlich wie die Definitionsregeln der Cron -Expression unter Linux. Ein Cron -Ausdruck besteht aus 6 oder 7 Leerzeichen, die durch Zeitfelder getrennt sind, wie in der folgenden Abbildung gezeigt:
Gemeinsame Ausdrücke:
Nehmen Sie eine Kastanie:
Fügen Sie eine Arbeit () hinzu, die alle 10 Sekunden ausgeführt wird.
HINWEIS: Wenn die Ausführungszeit der Methode die Aufgabenplanungsfrequenz überschreitet, wird der Scheduler im nächsten Zyklus ausgeführt.
Beispielsweise: Unter der Annahme, dass die work () -Methode in der 0. Sekunde ausgeführt wird und die Methode für 12 Sekunden ausgeführt wird, wird die 20 -Sekunden -Methode das nächste Mal die 20. Sekunde ausgeführt.
@ComponentPublic Class MyTask {@Scheduled (cron = "0/10 * * * * *") public void work () {// Aufgabenausführungslogik}}1.3.2 Festintervallaufgaben
Die nächste Ausführungszeit für Aufgaben wird aus der Endzeit der letzten Aufgabenausführung der Methode berechnet. Und starten Sie die periodische Ausführung von Aufgaben mit dieser Regel.
Nehmen Sie eine Kastanie:
Fügen Sie eine work () -Methode hinzu und führen Sie sie alle 10 Sekunden aus.
Zum Beispiel: Angenommen, die Arbeit () wird in der 0. Sekunde ausgeführt und die Methode wird 12 Sekunden lang ausgeführt. Wenn die Arbeit () die Arbeit () () ausgestellt wird, wird die 22. Sekunde ausgeführt.
@Scheduled (fixedDelay = 1000*10) public void work () {// Aufgabenausführungslogik}1.3.3 Aufgaben fester Frequenz
Führen Sie Aufgaben bei der angegebenen Häufigkeit aus und starten Sie die periodische Ausführung der Planung mit dieser Regel.
Nehmen Sie eine Kastanie:
Fügen Sie eine Arbeit () hinzu, die alle 10 Sekunden ausgeführt wird.
Hinweis: Wenn die Ausführungszeit der Methode die Aufgabenplanungsfrequenz überschreitet, führt der Scheduler die nächste Aufgabe unmittelbar nach der aktuellen Methode aus.
Zum Beispiel: Angenommen, die Arbeit () wird in der 0. Sekunde ausgeführt und die Methode wird 12 Sekunden lang ausgeführt, dann wird die Arbeit () die Arbeit () die 12. Sekunde ausgeführt.
@Scheduled (FixedRate = 1000*10) public void work () {// Aufgabenausführungslogik}}2. Konfigurieren Sie den Takenschicht -Thread -Pool
In tatsächlichen Projekten kann unser System mehrere Zeitaufgaben definieren. Dann können mehrere Zeitaufgaben unabhängig und parallel ausgeführt werden.
Wenn Sie sich den Quellcode für org.springframework.Scheduling.Config.ScheduledTaskRegistrar ansehen. Dies kann für unser Multitasking tödlich sein. Wenn gleichzeitig mehrere Aufgaben ausgeführt werden (oder gleichzeitig ausgeführt werden müssen), erlebt der Task Scheduler die Zeitdrift und die Ausführungszeit der Aufgaben wird ungewiss sein.
protected void enderuletasks () {if (this.taskScheduler == null) {this.localexecutor = Executors.NewsingLethreadScheduledexecutor (); this.taskScheduler = new ConcurrentTaskScheduler (this.localExecutor);} // weglassen ...}2.1 benutzerdefinierten Threadpool
Eine Konfigurationsklasse hinzugefügt, um die Zeitplanungsoberfläche zu implementieren. Schreiben Sie die Konfigurationsmethode neu und setzen Sie einen benutzerdefinierten Thread -Pool über Taskregistrar.
@ConfigurationPublic Class ScheduleConfig Implements SchedulingConFigurer {@Overridepublic void configurETASKs (afuledTaskRegistrar TaskRegistrar) {TaskRegistrar.SetScheduler (Taskexecutor ()); Executors.NewScheduled threadpool (20);}}3. Probleme in praktischen Anwendungen
3.1 Start- und Abschaltprobleme in Webanwendungen
Wir wissen, dass Bohnen, die durch die Feder geladen oder initialisiert wurden, automatisch entladen (zerstört) werden, wenn der Service gestoppt wird. Da jedoch Threads JVM-Ebene sind, steht der Lebenszyklus dieses Threads nicht mit der Webanwendung überein. Das heißt, selbst wenn die Webanwendung gestoppt wird, endet der Thread immer noch nicht (Tod).
Lösung:
1) Das aktuelle Objekt wird durch die Feder initialisiert
Wenn Frühling eine Instanz deinstalliert (zerstört), wird die Zerstörungsmethode der Instanz aufgerufen. Implementiert durch Implementierung der DisposableBean -Schnittstelle übergeordnete Zerstörungsmethode. Schließen Sie den Faden aktiv in der Zerstörungsmethode.
@ComponentPublic Class Mytask implementiert DisposableBean {@Overridepublic void Destroy () löst eine Ausnahme aus {// Thread- oder Thread -Pool -ThreadpoolTaskScheduler -Scheduler = (ThreadpoolTaskScheduler) applicationContext.getBean ("Scheduler");;2) Das aktuelle Objekt wird nicht durch Feder initialisiert (verwaltet)
Dann können wir einen Servlet -Kontext -Hörer hinzufügen, um den Thread aktiv zu schließen, wenn der Servlet -Dienst gestoppt wird.
öffentliche Klasse MytaskListenter implementiert servletContextListener {@Overridepublic void contextDestroyed (servletContexevent arg0) {// Thread- oder Threadpool} // weglassen ...}3.2 Verteilte Bereitstellungsprobleme
In den tatsächlichen Projekten wird unser System normalerweise in Clustern, verteilten oder Katastrophenwiederherstellungen eingesetzt. Anschließend können die Zeitaufgaben mit Parallelitätsproblemen aufweisen, dh dieselbe Aufgabe wird gleichzeitig auf mehreren Servern ausgeführt.
Lösung (verteiltes Schloss):
1) Durch die Datenbanktabelle sperren
2) Cache Middleware
3) implementiert durch Zookeeper
Zusammenfassen:
Der Frühlingsplan bietet uns ein einfaches, schnelles, effizientes und stabiles Timing -Task -Framework. Es ist jedoch notwendig, den Lebenszyklus von Threads und verteilten Bereitstellungen zu berücksichtigen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.