Vor der Verwendung von Spring Boot bestand unser Ansatz darin, einen Task -Pool in der Konfigurationsdatei zu definieren und dann die @Async kommentierte Aufgabe zur Ausführung in den Aufgabenpool zu werfen. So ist die Methode im Spring -Boot, wie man asynchrone Aufgabenaufrufe implementiert, einfacher.
Lassen Sie uns den vorherigen kombinieren
Spring Boot Integrated JMS (Activemq Implementierung)
Der Code in diesem Blog wird implementiert.
1. Funktionsbeschreibung
Wenn ein Verbraucher eine Nachricht in der Warteschlange hört, verarbeitet er die Aufgabe, die Nachricht als asynchrone Aufgabe zu empfangen.
2. Codeänderung
Verbraucher 1:
Paket com.chhliu.springboot.jms; import org.springframework.jms.annotation.jmsListener; import org.springframework.Scheduling.annotation.async; import org.springframework.stereotype.comPonent; @Component Public Class Consumer {@jmsListener (destination = "myTest.queue") @aSync // Diese Methode wird asynchron ausgeführt, was bedeutet, dass der Haupt -Thread die Methode direkt überspringt. Verwenden Sie den Thread -Pool, um die Methode public void receme zu verwenden (String Text) {). "+Text); }}Verbraucher 2:
Paket com.chhliu.springboot.jms; import org.springframework.jms.annotation.jmsListener; import org.springframework.messaging.handler.annotation.sendTo; import org.springframework.stereotype.comPonent; @Component public class Consumer2 {@jmsListener (destination = "myTest.queue") @SendTo ("out.queue") public String Receme -Empfänger (String Text) {System.out.println (Thread.currentThread (). Rückgabe "Rückgabenachricht"+Text; }}Fügen Sie der Testklasse die folgende Annotation hinzu:
Paket com.chhliu.springboot.jms; importieren javax.jms.destination; import org.apache.activemq.command.activemqqueue; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.test.context.springboottest; import org.springframework.Scheduling.annotation.enableAsync; import org.springframework.test.context.junit4.springrunner; @Runwith (springrunner.class) @springboottest @enableAsync // Aktivieren Sie asynchronische Aufgaben zur Unterstützung der öffentlichen Klassen SpringbootjmsApplicationTests {@autowired Private Producer Producer; @Test public void contextloads () löscht InterruptedException {destination destination = new ActivemQQueue ("myTest.queue"); für (int i = 0; i <100; i ++) {Produzent.SendMessage (Ziel, "MyName ist chhliu !!!"); }}} 3. Testergebnisse
DefaultMessagelistenerContainer-1: Consumer2 erhält: MyName ist Chhliu !!! Die Antwortnachricht von der Out.queue -Warteschlange lautet: Return MessaGemyname ist Chhliu !!! SimpleAsynctaskexecutor-45: Die vom Verbraucher empfangene Nachricht lautet: myName ist chhliu !!! DefaultMessagelistenerContainer-1: Consumer2 erhält: MyName ist Chhliu !!! Die Antwortnachricht von der Out.queue -Warteschlange lautet: Return MessaGemyname ist Chhliu !!! SimpleAsynctaskexecutor-46: Die vom Verbraucher empfangene Nachricht lautet: myName ist chhliu !!! DefaultMessagelistenerContainer-1: Die von Consumer empfangene Nachricht lautet: myName ist chhliu !!! Die Antwortnachricht von der Out.queue -Warteschlange lautet: Return MessaGemyname ist Chhliu !!! SimpleAsynctaskexecutor-47: Die vom Verbraucher empfangene Nachricht lautet: myName ist chhliu !!! DefaultMessagelistenerContainer-1: Die von Consumer empfangene Nachricht lautet: myName ist chhliu !!! Die Antwortnachricht von der Out.queue -Warteschlange lautet: Return MessaGemyname ist Chhliu !!! SimpleAsynctaskexecutor-48: Die vom Verbraucher empfangene Nachricht lautet: myName ist chhliu !!! DefaultMessagelistenercontainer-1: Consumer2 ist: myName ist chhliu !!! Die Antwortnachricht von der Out.queue -Warteschlange lautet: Return MessaGemyname ist Chhliu !!! SimpleAsynctaskexecutor-49: Die vom Verbraucher empfangene Nachricht lautet: myName ist chhliu !!! DefaultMessagelistenerContainer-1: Die von Consumer empfangene Nachricht lautet: myName ist chhliu !!! Die Antwortnachricht von der Out.queue -Warteschlange lautet: Return MessaGemyname ist Chhliu !!! SimpleAsynctaskexecutor-50: Die von Verbraucher empfangene Nachricht lautet: MyName ist Chhliu !!! DefaultMessagelistenerContainer-1: Die von Consumer empfangene Nachricht lautet: myName ist chhliu !!!
Aus den oben genannten Testergebnissen können wir feststellen, dass die Verbraucher-2-Nachrichten, da Verbraucher 2 die asynchrone Aufgabenmethode nicht verwendet, mit dem festen Thread-DefaultMessagelistenercontainer-1 verarbeitet werden. Consumer 1 verwendet die asynchrone Aufgabenmethode und jedes Mal, wenn die empfangene Nachricht von einem anderen Thread verarbeitet wird. Wenn die Nachricht empfangen wird, wird die Aufgabe zur Verarbeitung direkt in den Aufgabenpool geworfen, und der Haupt -Thread wird weiter ausgeführt. Es kann auch aus den Testergebnissen abgeleitet werden, dass Spring Boot standardmäßig den New -CachedThreadpool -Thread -Pool verwendet.
Für eine bestimmte Verwendung von Thread -Pools finden Sie in einem weiteren Blog -Beitrag von mir: //www.vevb.com/article/134870.htm
4. Asynchrone Aufgaben sind zurückgekehrt
In der tatsächlichen Entwicklung begegnen wir häufig Situationen, in denen asynchrone Aufgaben zurückkehren. Wie implementieren wir es im Spring Boot?
Das Folgende ist ein Beispiel für asynchrones E -Mail, das als Beschreibung gesendet wird. Der Beispielcode lautet wie folgt:
@Async ("Taskexecutepool") // Die asynchrone Aufgabe wird dem Taskexexepool -Aufgabepool übermittelt, um die öffentliche Zukunft <Antwort> Dosendemail (mailinfo mailinfo) auszuführen {// Die asynchrone Aufgabe zurückgibt, zukünftige <Ansynchronen -Asynchronen (). Dosendemail Asynchrone Methode wurde genannt! "); SendmailSession Session = null; Antwort res = neue Antwort (); boolean isok = sendemail (MailInfo); // Die spezifische Methode zum Senden von E -Mails if (isok) {res.SetsuSccess (true); } else {res.setsuSccess (false); } Neue Asyncresult <Reaktion> (res) zurückgeben;Wie benutze ich es nach der Rückkehr? Der Beispielcode lautet wie folgt:
Future <Ponaktion> result = taskjob.dosendemail (MailInfo); res = result.get (6, TimeUnit.seconds);
Auf diese Weise können Sie die asynchrone Aufgabe zurückbringen!
Zusammenfassen
Das oben oben ist die Implementierungsmethode für Spring Boot Asynchronous (ASYNC) Task -Planung, die Ihnen vorgestellt wurde. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!