Antes de usar Spring Boot, nuestro enfoque era definir un grupo de tareas en el archivo de configuración y luego arrojar la tarea anotada @Async al grupo de tareas para su ejecución. Entonces, en Spring Boot, cómo implementar llamadas de tareas asíncronas, el método es más simple.
Combinemos el anterior
Spring Boot Integrated JMS (Implementación de ActiveMQ)
Se implementa el código en este blog.
1. Descripción de la función
Cuando un consumidor escucha un mensaje en la cola, él o ella procesa la tarea que recibe el mensaje como una tarea asincrónica.
2. Modificación del código
Consumidor 1:
paquete com.chhliu.springboot.jms; importar org.springframework.jms.annotation.jmsListener; importar org.springframework.scheduling.annotation.async; importar org.springframework.stereotype.component; @Component Public Class Consumer {@jmsListener (destino = "mytest.queue") @async // Este método se ejecutará de manera asincrónica, lo que significa que el hilo principal omitirá el método directamente, pero use el subproceso en el grupo de subprocesos para ejecutar el método public void recibe (string text) {system.println (thread.currentthread (). GetNe (). es: "+texto); }}Consumidor 2:
paquete com.chhliu.springboot.jms; importar org.springframework.jms.annotation.jmsListener; importar org.springframework.messaging.handler.annotation.sendto; importar org.springframework.stereotype.component; @Component public class Consumer2 {@jmslistener (destino = "mytest.queue") @sendto ("out.queue") cadena pública recibeCequeue (string text) {system.out.println (thread.currentThread (). GetName ()+": El mensaje recibido por el consumidor2 es:"+text); Return "Return Message"+Text; }}Agregue la siguiente anotación a la clase de prueba:
paquete com.chhliu.springboot.jms; import javax.jms.destination; importar org.apache.activemq.command.activemqqueue; importar org.junit.test; importar org.junit.runner.runwith; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.boot.test.context.springboottest; importar org.springframework.scheduling.annotation.enableasync; importar org.springframework.test.context.junit4.springrunner; @RunWith (SpringRunner.class) @SpringBoottest @enableasync // Habilitar tareas asíncronas para apoyar la clase pública SpringBootJMsApplicationTests {@autewired productor privado productor; @Test public void contextloads () lanza interruptedException {Destination Destination = new Activemqqueue ("mytest.Queue"); para (int i = 0; i <100; i ++) {productor.sendMessage (destino, "myname es chhliu !!!"); }}} 3. Resultados de la prueba
DefaultMessAsageListenerContainer-1: Consumer2 recibe: ¡MyName es Chhliu! El mensaje de respuesta recibido del Out. SimpleAsynctaskExecutor-45: ¡El mensaje recibido por el consumidor es: MyName es Chhliu! DefaultMessAsageListenerContainer-1: Consumer2 recibe: ¡MyName es Chhliu! El mensaje de respuesta recibido del Out. SimpleAsynctaskExecutor-46: ¡El mensaje recibido por el consumidor es: MyName es Chhliu! DefaultMessageListenerContainer-1: El mensaje recibido por Consumer2 es: ¡MyName es Chhliu! El mensaje de respuesta recibido del Out. SimpleAsynctaskExecutor-47: ¡El mensaje recibido por el consumidor es: MyName es Chhliu! DefaultMessageListenerContainer-1: El mensaje recibido por Consumer2 es: ¡MyName es Chhliu! El mensaje de respuesta recibido del Out. SimpleAsynctaskExecutor-48: ¡El mensaje recibido por el consumidor es: MyName es Chhliu! DefaultMessAsageListenerContainer-1: Consumer2 es: ¡MyName es Chhliu! El mensaje de respuesta recibido del Out. SimpleAsynctaskExecutor-49: ¡El mensaje recibido por el consumidor es: MyName es Chhliu! DefaultMessageListenerContainer-1: El mensaje recibido por Consumer2 es: ¡MyName es Chhliu! El mensaje de respuesta recibido del Out. SimpleAsynctaskExecutor-50: ¡El mensaje recibido por el consumidor es: MyName es Chhliu! DefaultMessageListenerContainer-1: El mensaje recibido por Consumer2 es: ¡MyName es Chhliu!
De los resultados de las pruebas anteriores, podemos ver que, dado que el consumidor 2 no usa el método de tarea asincrónica, el consumidor 2 consume mensajes se procesan mediante el hilo fijo, el shiftMessageListenercontainer-1. Consumer 1 utiliza el método de tarea asincrónica, y cada vez que el mensaje recibido se procesa mediante un hilo diferente. Cuando se recibe el mensaje, la tarea se lanza directamente al grupo de tareas para su procesamiento, y el hilo principal continúa ejecutándose. También se puede inferir de los resultados de la prueba que Spring Boot utiliza el grupo de subprocesos NewCachedThreadPool de forma predeterminada.
Para un uso específico de grupos de hilos, consulte otra publicación de blog de mí: //www.vevb.com/article/134870.htm
4. Las tareas asincrónicas han regresado
En el desarrollo real, a menudo encontramos situaciones en las que regresan las tareas asincrónicas. Entonces, ¿cómo lo implementamos en Spring Boot?
El siguiente es un ejemplo de envío de correo electrónico asíncrono como descripción. El código de ejemplo es el siguiente:
@Async ("TaskExecutepool") // La tarea asíncrona se enviará al grupo de tareas de TaskExecutepool para ejecutar public Future Public <SPOSS> DOSENDEMAIL (mailInfo mailInfo) {// el retorno de tareas asíncronos, use el futuro <ps. Respuesta> a Asíncronamente regresar log.info (Thread.CurrentThread (). El método asincrónico se llamó! "); Sendmailsession session = null; Respuesta Res = nueva respuesta (); boolean isok = sendEmail (mailInfo); // El método específico para enviar correos electrónicos if (ISOK) {res.setsuccess (true); } else {res.setsuccess (falso); } return New Asyncresult <Response> (res);¿Cómo usarlo después de regresar? El código de muestra es el siguiente:
Future <respuesta> resultado = taskJOB.DOSENDEMAIL (mailInfo); res = resultado.get (6, TimeUnit.seconds);
¡De esta manera puede obtener el regreso de la tarea asíncrona!
Resumir
Lo anterior es el método de implementación de la programación de tareas de arranque de primavera (async) que se le presenta. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!