Vorwort
In diesem Artikel wird hauptsächlich die relevanten Inhalte über den asynchronen Anruf von Spring Boot Integration bei Async vorgestellt. Es wird für Ihre Referenz und Ihr Lernen geteilt. Ich werde unten nicht viel sagen, schauen wir uns die detaillierte Einführung zusammen an.
Was ist ein asynchroner Anruf?
Asynchrone Anrufe sind relativ zu synchronen Aufrufen. Synchrone Anrufe beziehen sich auf das Programm, das Schritt für Schritt in einer vorgegebenen Reihenfolge ausgeführt wird. Jeder Schritt muss ausgeführt werden, bis der vorherige Schritt ausgeführt wurde. Asynchrone Anrufe müssen nicht darauf warten, dass das vorherige Programm ausgeführt wird.
Asynchrone Verarbeitungsmethode
Wie implementieren Sie asynchrone Anrufe?
Multithreading ist ein Schlüsselwort, an das viele Menschen zunächst denken. Ja, Multithreading ist eine Möglichkeit, asynchrone Anrufe zu implementieren.
In Nicht-Spring-Projekten möchten wir asynchrone Aufrufe implementieren, Multi-Threading-Methoden zu verwenden. Wir können die ablaufbare Schnittstelle selbst implementieren oder die Thread-Klasse integrieren oder den von JDK1.5 oder höher bereitgestellten Thread-Thread-Pool verwenden.
STRNGBOOT bietet eine sehr bequeme Möglichkeit, asynchrone Anrufe auszuführen.
Folgen Sie dem offiziellen Beispiel
Code eingeben
Maven -Abhängigkeiten:
<Ters </GroupId> org.springFramework.boot </GroupId> <artifactId> Spring-Boot-Starter-Parent </artifactId> <version> 1.5.Release </Version> </parent> <Depelen> <abhängigkeit> <gruppe org. </abhängig> </Abhängigkeiten>
Starten Sie die Klasse: Fügen Sie @EnableAsync Annotation hinzu
@SpringbootApplication @enableAsync öffentliche Klasse Anwendung {public static void main (String [] args) {SpringApplication.run (application.class, args); }}Regler
Fügen Sie einfach @Async Annotation zu der Methode hinzu, die Sie für die Ausführung asynchron ausführen müssen
@RestController @RequestMapping ("") öffentliche Klasse AsyncTaskController {@RequestMapping ("") public String dotask () wirft InterruptedException aus {long currentTimemillis = System.currentTimemillis (); this.task1 (); this.task2 (); this.task3 (); long CurrentTimemillis1 = System.currentTimemillis (); Rückgabe "Task Task Total Time Consed:"+(currentTimemillis1-currentTimillis)+"MS"; } @Async public void Task1 () löst InterruptedException aus {long currentTimemillis = system.currentTimemillis (); Thread.sleep (1000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task1 Task Time Consed:"+(CurrentTimillis1-CurrentTimemillis)+"MS"); } @Async public void task2 () löst InterruptedException aus {long currentTimemillis = system.currentTimemillis (); Thread.Sleep (2000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task2 Task zeitaufwändig:"+(currentTimemillis1-currentTimemillis)+"MS"); } @Async public void task3 () löst InterruptedException aus {long currentTimemillis = system.currentTimemillis (); Thread.sleep (3000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task3 Task zeitaufwändig:"+(currentTimemillis1-currentTimemillis)+"MS"); }}Die Hauptfunktion führt das Spirngboot -Projekt aus. Nach Abschluss des Starts Zugriffe: http: // localhost: 8080/http: // localhost: 8080/
Konsole:
Task1 Task Time: 1012ms Task2 Task -Zeit: 2009ms Task3 Task -Zeit: 3004ms
Nach einer Weile wird die Ausgabe eingegeben:
Gesamtarbeitszeit: 6002 ms
Asynchron nicht ausgeführt!
Könnte es sein, dass der Code falsch geschrieben ist? Ich habe es mehrmals überprüft und keine offensichtlichen Fehler gefunden. Ich erinnere mich, dass der Frühling auch ähnliche Probleme mit @transactional Annotation hatte. Wenn Spring eine Klasse mit @Transactional Annotation -Methode scannt, wird eine Proxy -Klasse generiert, und die Proxy -Klasse beginnt und schließt die Transaktion. In derselben Klasse wird der Methodenaufruf im Klassenkörper ausgeführt, und der Frühling kann diesen Methodenaufruf nicht abfangen.
Geben Sie plötzlich die asynchrone Aufgabe separat in eine Klasse ein und passen Sie den Code an, um einzugeben:
Regler
@RequestMapping ("") @restController Public Class AsyncTaskController {@autowired private asynctask asynctask; @RequestMapping ("") public String dotask () löscht InterruptedException {long CurrentTimemillis = System.currentTimemillis () aus; asyncTask.task1 (); AsyncTask.task2 (); Asynctask.Task3 (); long CurrentTimemillis1 = System.currentTimemillis (); return "Task-Task Total Time-of-zeitaufwändig:"+(currentTimemillis1-currenttimemillis)+"MS"; }} Asynchroner Aufgabenklasse
@Component public class asynctask {@aSync public void task1 () löscht InterruptedException {Long CurrentTimemillis = System.currentTimemillis () aus; Thread.sleep (1000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task1 Task zeitaufwändig:"+(currentTimemillis1-currenttimemillis)+"MS"); } @Async public void task2 () löst InterruptedException aus {long currentTimemillis = system.currentTimemillis (); Thread.Sleep (2000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task2 Task zeitaufwändig:"+(currentTimemillis1-currentTimemillis)+"MS"); } @Async public void task3 () löst InterruptedException aus {long currentTimemillis = system.currentTimemillis (); Thread.sleep (3000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task3 Task zeitaufwändig:"+(currentTimemillis1-currentTimemillis)+"MS"); }}Konsole:
Task1 Task Time: 1012ms Task2 Task -Zeit: 2009ms Task3 Task -Zeit: 3004ms
Geben Sie die Browserergebnisse ein:
Gesamtaufgabenzeit: 19 ms
Der asynchrone Anruf gelang es!
Woher wissen Sie, wann die drei asynchronen Aufgaben ausgeführt werden und welche Ergebnisse der Ausführung sind? Sie können die Methode zum Hinzufügen eines FAATS -Rückrufs zum Richter verwenden
Der Code wird eingegeben:
Asynchroner Aufgabenklasse
@Component Public Class Asynctask {@aSync public Future <string> task1 () löscht InterruptedException {Long CurrentTimillis = System.currentTimemillis () aus; Thread.sleep (1000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task1 Task zeitaufwändig:"+(currentTimemillis1-currenttimemillis)+"MS"); Neue Asyncresult <string> zurückgeben ("Task1 -Ausführung ist abgeschlossen"); } @Async public Future <string> task2 () löst InterruptedException aus {Long CurrentTimemillis = System.currentTimemillis (); Thread.Sleep (2000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task2 Task zeitaufwändig:"+(currentTimemillis1-currentTimemillis)+"MS"); Neue Asyncresult <string> zurückgeben ("Task2 -Ausführung ist abgeschlossen"); } @ASync public Future <string> task3 () löscht InterruptedException {Long CurrentTimemillis = System.currentTimemillis (); Thread.sleep (3000); long CurrentTimemillis1 = System.currentTimemillis (); System.out.println ("Task3 Task zeitaufwändig:"+(currentTimemillis1-currentTimemillis)+"MS"); Neue asyncresult <string> zurückgeben ("Task3 -Ausführung abgeschlossen"); }} Regler
@RequestMapping ("") @restController Public Class AsyncTaskController {@autowired private asynctask asynctask; @RequestMapping ("") public String dotask () löscht InterruptedException {long CurrentTimemillis = System.currentTimemillis () aus; Future <String> Task1 = asynctask.task1 (); Future <String> task2 = asynctask.task2 (); Future <String> task3 = asynctask.task3 (); String -Ergebnis = null; for (;;) {if (task1.isdone () && task2.isdone () && task3.isdone ()) {// Alle drei Aufgaben werden gerufen, um die Schleife zu beenden und auf Break zu warten; } Thread.sleep (1000); } long CurrentTimemillis1 = System.currentTimemillis (); result = "Gesamtzeitaufwändig von Aufgaben:"+(CurrentTimillis1-Stromversorgungstimillis)+"MS"; Rückgabeergebnis; }}Konsolenausgabe:
Task1 Task Time: 1000ms Task2 Task -Zeit: 2001ms Task3 Task -Zeit: 3001ms
Browserausgabe:
Gesamtaufgabenzeit: 4015 ms
Der asynchrone Anruf ist erfolgreich und das Programm gibt das Ergebnis nur dann zurück, wenn alle Aufgaben erledigt sind!
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.