Avant d'utiliser Spring Boot, notre approche était de définir un pool de tâches dans le fichier de configuration, puis de jeter la tâche annotée @async dans le pool de tâches pour l'exécution. Donc, dans Spring Boot, comment implémenter les appels de tâches asynchrones, la méthode est plus simple.
Combinons le précédent
Spring Boot Integrated JMS (Implémentation ActiveMQ)
Le code de ce blog est implémenté.
1. Description de la fonction
Lorsqu'un consommateur écoute un message dans la file d'attente, il traite la tâche recevant le message comme une tâche asynchrone.
2. Modification du code
Consommateur 1:
package com.chhliu.springboot.jms; import org.springframework.jms.annotation.jmsListener; import org.springframework.scheduling.annotation.async; import org.springframework.sterereotype.Component; @Component public class Consumer {@jmsListener (Destination = "mytest.queue") @async // Cette méthode sera exécutée de manière asynchrone, ce qui signifie que le thread principal sautera directement la méthode, mais utilise le thread dans le pool de threads pour exécuter la méthode publique void Repereeue (String Text) {System.out.println (Thread.CurrentThread (). "+ texte); }}Consumer 2:
package com.chhliu.springboot.jms; import org.springframework.jms.annotation.jmsListener; import org.springframework.messaging.handler.annotation.sendto; import org.springframework.sterereotype.Component; @Component public class Consumer2 {@jmsListener (Destination = "mytest.queue") @sendto ("out.queue") public String RerereEue (String text) {System.out.println (Thread.currentThread (). return "return message" + texte; }}Ajoutez l'annotation suivante à la classe de test:
package com.chhliu.springboot.jms; Importer 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 // activer des tâches asynchrones pour soutenir la classe publique SpringbootJmsApplicationTests {@autowired producteur privé producteur; @Test public void contextloads () lève InterruptedException {Destination Destination = new activeMQQueue ("myTest.Queue"); pour (int i = 0; i <100; i ++) {producer.sendMessage (destination, "MyName est chhliu !!!"); }}} 3. Résultats des tests
DefaultMessageListenerContainer-1: Consumer2 reçoit: MyName est chhliu !!! Le message de réponse reçu de la file d'attente Out.Queue est: return MessageMyName est chhliu !!! Simpleasynctaskexecutor-45: Le message reçu par le consommateur est: MyName est chhliu !!! DefaultMessageListenerContainer-1: Consumer2 reçoit: MyName est chhliu !!! Le message de réponse reçu de la file d'attente Out.Queue est: return MessageMyName est chhliu !!! Simpleasynctaskexecutor-46: Le message reçu par le consommateur est: MyName est chhliu !!! DefaultMessageListenerContainer-1: Le message reçu par Consumer2 est: MyName est Chhliu !!! Le message de réponse reçu de la file d'attente Out.Queue est: return MessageMyName est chhliu !!! Simpleasynctaskexecutor-47: Le message reçu par le consommateur est: MyName est chhliu !!! DefaultMessageListenerContainer-1: Le message reçu par Consumer2 est: MyName est Chhliu !!! Le message de réponse reçu de la file d'attente Out.Queue est: return MessageMyName est chhliu !!! Simpleasynctaskexecutor-48: Le message reçu par le consommateur est: MyName est chhliu !!! DefaultMessageListenerContainer-1: Consumer2 est: MyName est chhliu !!! Le message de réponse reçu de la file d'attente Out.Queue est: return MessageMyName est chhliu !!! Simpleasynctaskexecutor-49: Le message reçu par le consommateur est: MyName est chhliu !!! DefaultMessageListenerContainer-1: Le message reçu par Consumer2 est: MyName est Chhliu !!! Le message de réponse reçu de la file d'attente Out.Queue est: return MessageMyName est chhliu !!! SimpleasynctaskExEcutor-50: Le message reçu par le consommateur est: MyName est chhliu !!! DefaultMessageListenerContainer-1: Le message reçu par Consumer2 est: MyName est Chhliu !!!
D'après les résultats des tests ci-dessus, nous pouvons voir que puisque Consumer 2 n'utilise pas la méthode de tâche asynchrone, les messages Consumer 2 Consumes sont traités par le thread Fixe DefaultMessageListenerContainer-1. Le consommateur 1 utilise la méthode de tâche asynchrone et chaque fois que le message reçu est traité par un thread différent. Lorsque le message est reçu, la tâche est jetée directement dans le pool de tâches pour le traitement et le fil principal continue de s'exécuter. Il peut également être déduit des résultats du test que Spring Boot utilise le pool de threads NewCachedTheredpool par défaut.
Pour une utilisation spécifique des pools de fil, veuillez vous référer à un autre article de blog de moi: //www.vevb.com/article/134870.htm
4. Des tâches asynchrones sont revenus
Dans le développement réel, nous rencontrons souvent des situations où les tâches asynchrones reviennent. Alors, comment l'implémentons-nous dans Spring Boot?
Ce qui suit est un exemple d'e-mail asynchrone envoyant comme description. L'exemple de code est le suivant:
@Async ("taskexecutepool") // La tâche asynchrone sera soumise au pool de tâches TaskExEcutool pour exécuter un avenir public <Sponse> DoSendemail (use future <Sponse> à Asynchronly Return Log.info (Thread.CurrentThread (). La méthode asynchrone dosendemail a été appelée! "); SendMailSession Session = NULL; Réponse res = nouvelle réponse (); booléen isok = SendEmail (MailInfo); // la méthode spécifique d'envoi d'e-mails if (ISOK) {res.setsuccess (true); } else {res.setsuccess (false); } Renvoie un nouveau AsynCresult <Sporm> (RES);Comment l'utiliser après le retour? L'exemple de code est le suivant:
Future <Sponse> result = taskjob.doSendemail (MailInfo); res = result.get (6, timeunit.seconds);
De cette façon, vous pouvez obtenir le retour de la tâche asynchrone!
Résumer
Ce qui précède est la méthode d'implémentation de Spring Boot Asynchronous (async) Planification de tâches qui vous a été présentée. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!