Explicación detallada de los ejemplos de ActiveMQ de integración de SpringBoot

En el proceso de desarrollo del proyecto, a menudo nos encontramos con escenarios comerciales similares: los usuarios solicitan el retiro de efectivo, el fondo realiza el procesamiento contable, envía SMS de retiro de efectivo y llama a los canales de pago bancarios.

imagen

En este proceso, se requiere mucho tiempo para llamar al canal tripartito (mensaje de texto o canal bancario), y el procesamiento contable también puede ser procesado por un sistema contable especial. Luego, para mejorar la concurrencia y la velocidad correspondiente, las siguientes tres operaciones se pueden procesar de forma asíncrona. Esto usa la cola de mensajes.

El middleware de Message Queueing es un componente importante en un sistema distribuido. Principalmente resuelve los problemas de acoplamiento de aplicaciones, mensajería asincrónica, corte de tráfico, etc. Alcanza un alto rendimiento, alta disponibilidad, escalabilidad y eventual consistencia arquitectónica, indispensable para grandes sistemas distribuidos. Middleware.

Las colas de mensajes más comunes en el mercado son: ActiveMQ, RabbitMQ, ZeroMQ, Kafka, MetaMQ, RocketMQ.

ActiveMQ está integrado específicamente en el arrancador Spring Boot, por lo que en este artículo hablaremos sobre la integración de ActiveMQ.

Especificación JMS

JMS es la interfaz del programa de aplicación de Java Message Service (Java Message Service). Es una API de middleware orientado a mensajes (MOM) en la plataforma Java, que se utiliza para enviar mensajes entre dos aplicaciones o en un sistema distribuido para aplicaciones asíncronas. Comunicación. Java Message Service es una API que no tiene nada que ver con una plataforma específica y la mayoría de los proveedores de MOM admiten JMS.

El mecanismo de mensajes de JMS tiene dos modelos, uno es la forma de cola (punto a punto), los mensajes enviados solo pueden ser consumidos por un consumidor, el otro es el modo de suscripción (tema), que puede ser suscrito por múltiples suscriptores. Ambos recibirán el mismo mensaje.

ActiveMQ es una de las implementaciones de JMS.

Introducción a ActiveMQ

ActiveMQ es una implementación de código abierto de un middleware de mensajes basado en la especificación JMS (Java Message Servie). El objetivo de diseño de ActiveMQ es proporcionar un middleware de comunicación de mensajes estándar, orientado a mensajes e integrado en aplicaciones que puede abarcar varios idiomas y sistemas. .

Proporciona alta disponibilidad, excelente rendimiento, escalabilidad, estabilidad y seguridad para la mensajería en aplicaciones empresariales.

ActiveMQ implementa la especificación JMS y proporciona muchas características adicionales además. ActiveMQ admite el envío de mensajes en dos modos: cola y suscripción.

El proceso de transmisión de datos de AcitveMQ es el siguiente:

imagen

Dos tipos de mensajería ActiveMQ:

(1) Transmisión punto a punto, es decir, un productor corresponde a un consumidor, y el productor empuja los datos para romperlos, los datos se almacenan en una cola de ruptura y cuando el consumidor recibe los datos en la cola.

(2) Transmisión basada en el modelo de publicación / suscripción, es decir, según el tema de suscripción para recibir los datos correspondientes, un productor puede enviar datos a múltiples consumidores, lo que es similar a la implementación del protocolo MQTT.

Los dos tipos de envío de mensajes son diferentes. Los consumidores de transmisión punto a punto pueden recibir los datos enviados por el productor antes de la conexión, mientras que los consumidores basados ​​en el modo de transmisión de publicación / suscripción solo pueden recibir los datos enviados por el productor después de la conexión.

Spring Boot integra ActiveMQ

Spring Boot proporciona específicamente spring-boot-starter-activemq para ActiveMQ para admitir la configuración de integración automática de ActiveMQ en Spring Boot. Sobre esta base, podemos integrar y utilizar fácilmente.

Crea un proyecto e introduce dependencias

Cree un proyecto Spring Boot estándar e introduzca las siguientes dependencias en el proyecto:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

Si no necesita procesamiento web u otro procesamiento relacionado en este momento, simplemente introduzca la dependencia. Si usa pool, debe agregar las siguientes dependencias al pom:

<dependency>
     <groupId>org.apache.activemq</groupId>
     <artifactId>activemq-pool</artifactId>
</dependency>

Archivo de configuración

Agregue la siguiente configuración en application.properties:

# 基于内存的ActiveMQ
spring.activemq.in-memory=true
# 不使用连接池,如果使用连接池还需在pom中添加activemq-pool的依赖
spring.activemq.pool.enabled=false

# 独立安装的ActiveMQ
#spring.activemq.broker-url=tcp://127.0.0.1:61616
#spring.activemq.user=admin
#spring.activemq.password=admin

Hay dos conjuntos de configuraciones en la configuración anterior: Spring Boot admite ActiveMQ según la memoria y ActiveMQ según la instalación independiente. La forma basada en memoria de las solicitudes normales se utiliza para la conveniencia de las pruebas, y la forma basada en la instalación independiente se utiliza realmente en el entorno de producción. Para explicar las funciones y facilitar las pruebas, aquí se adopta la forma basada en memoria.

Ejemplo de modo de cola

Primero, implementemos la implementación basada en el formulario de cola (Cola). Aquí se deben utilizar dos clases ActiveMQQueue y JmsMessagingTemplate. El primero es implementado por la interfaz de ActiveMQ para javax.jms.Queue. Este último proporciona a Spring una clase de herramienta para enviar mensajes, que se combina con Queue para enviar mensajes.

Se ha creado una instancia de JmsMessagingTemplate de forma predeterminada, solo úsela directamente. ActiveMQQueue requiere que creemos una instancia y pasemos el nombre de la cola de mensajes.

@Configuration
public class MyMqConfig {

	@Bean
	public Queue queue() {
		return new ActiveMQQueue("sms.queue");
	}
}

Las operaciones de instanciación muy convencionales en Spring Boot no se repetirán. Cuando se crea una instancia de ActiveMQQueue, se crea nuestra cola y los productores y consumidores correspondientes se crean a continuación.

El código correspondiente al productor es el siguiente:

@Component
public class Producer {

	@Resource
	private JmsMessagingTemplate jmsMessagingTemplate;

	@Resource
	private Queue queue;

	public void sendMsg(String msg) {
		System.out.println("发送消息内容 :" + msg);
		this.jmsMessagingTemplate.convertAndSend(this.queue, msg);
	}

}

Aquí se utilizan JmsMessagingTemplate y Queue. Como se mencionó anteriormente, estas dos clases se han inicializado. La configuración para consumidores es la siguiente:

@Component
public class Consumer {

	@JmsListener(destination = "sms.queue")
	public void receiveMsg(String text) {
		System.out.println("接收到消息 : "+text);
	}
}

Spring proporciona puntos finales de escucha anotados: use @JmsListener. Utilice el método anotado del bean administrado @JmsListener para suscribirse. En Java 8, @JmsListener es una anotación repetible que puede asociar varios destinos JMS al mismo método. En Java 6 y 7, puede usar la anotación @JmsListeners.

El destino especifica el nombre de la cola de mensajes supervisados ​​como "sms.queue". La ejecución de este método se activará cuando se envíe un mensaje en la cola sms.queue y el contenido del mensaje sea texto.

Lo anterior completó la inicialización de la cola, la escritura del código de productor y consumidor, la siguiente prueba unitaria para verificar si el mensaje se puede enviar y procesar correctamente.

@RunWith(SpringRunner.class)
@SpringBootTest
public class ActiveMqTests {

	@Autowired
	private Producer producer;

	@Test
	public void sendSimpleQueueMessage() {
		this.producer.sendMsg("提现200.00元");
	}
}

Realice la prueba unitaria, encontrará que la siguiente información está impresa en el registro:

发送消息内容 :提现200.00元
接收到消息 : 提现200.00元

Explique que el mensaje se puede enviar y recibir normalmente. Si se basa en el modelo de memoria, el registro de excepciones "javax.jms.JMSException: peer (vm: // localhost # 1) detenido." Se imprimirá cuando se ejecute la prueba unitaria. Este es un error de nivel de información y un error de ActiveMQ.

Ejemplo de modelo de suscripción

Los mensajes enviados por difusión pueden ser recibidos por varios consumidores. Aquí agregamos mensajes de transmisión sobre la base original.

En primer lugar, cuando Spring Boot integra ActiveMQ, solo se admite una cola o transmisión de forma predeterminada, que se especifica en el elemento de configuración spring.jms.pub-sub-domain. True es el modo de transmisión, falso es el modo de cola y el modo de cola es compatible de forma predeterminada.

Para usar el modo de transmisión en este momento, debe agregar la siguiente configuración al archivo de configuración:

spring.jms.pub-sub-domain=true

Cabe señalar que el modo de cola no puede funcionar normalmente en este momento.

Luego agregue en MyMqConfig:

@Bean
public Topic topic() {
	return new ActiveMQTopic("sms.topic");
}

ActiveMQTopic se crea aquí y el nombre del tema se especifica como sms.topic.

El siguiente código se agrega a Producer:

@Resource
private Topic topic;

public void sendTopic(String msg) {
	System.out.println("发送Topic消息内容 :"+msg);
	this.jmsMessagingTemplate.convertAndSend(this.topic, msg);
}

Para demostrar varios receptores de transmisión, agregue dos consumidores en Comsumer:

@JmsListener(destination = "sms.topic")
public void receiveTopic1(String text) {
	System.out.println("receiveTopic1接收到Topic消息 : " + text);
}

@JmsListener(destination = "sms.topic")
public void receiveTopic2(String text) {
	System.out.println("receiveTopic2接收到Topic消息 : " + text);
}

Las siguientes pruebas se agregan a la clase de prueba unitaria:

@Test
public void sendSimpleTopicMessage() {
	this.producer.sendTopic("提现200.00元");
}

En este punto, ejecute la prueba unitaria, puede ver la siguiente información de registro:

发送Topic消息内容 :提现200.00元
receiveTopic2接收到Topic消息 : 提现200.00元
receiveTopic1接收到Topic消息 : 提现200.00元

El mensaje se envió con éxito.

Admite dos formularios al mismo tiempo

En el ejemplo anterior, se admite el modo de cola o el modo de transmisión. Si necesita admitir ambos en el entorno de producción, debe personalizar la instancia de JmsListenerContainerFactory. Por supuesto, si la configuración predeterminada de Spring Boot no puede satisfacer sus necesidades, también puede personalizar esta clase Este es solo uno de los escenarios.

Pasos básicos de configuración y uso: cree una instancia personalizada de JmsListenerContainerFactory a través de DefaultJmsListenerContainerFactory y haga referencia a ella a través del atributo containerFactory en la anotación @JmsListener.

Agregue la siguiente configuración a la clase de configuración MyMqConfig:

@Bean("queueListenerFactory")
public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {
	DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
	factory.setConnectionFactory(connectionFactory);
	factory.setPubSubDomain(false);
	return factory;
}

@Bean("topicListenerFactory")
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {
	DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
	factory.setConnectionFactory(connectionFactory);
	//设置为发布订阅方式, 默认情况下使用的生产消费者方式
	factory.setPubSubDomain(true);
	return factory;
}

Aquí hay clases de fábrica instanciadas basadas en colas y suscripciones. Luego agregue el atributo containerFactory al método de consumidor correspondiente. El código de muestra es el siguiente:

@JmsListener(destination = "sms.queue", containerFactory = "queueListenerFactory")
public void receiveMsg(String text) {
	System.out.println("接收到消息 : " + text);
}

@JmsListener(destination = "sms.topic", containerFactory = "topicListenerFactory")
public void receiveTopic1(String text) {
	System.out.println("receiveTopic1接收到Topic消息 : " + text);
}

Los dos tipos de mensajes se ejecutaron por separado y eran tanto normales como mutuamente beneficiosos. Al mismo tiempo, el elemento spring.jms.pub-subdominio en el archivo de configuración tampoco es válido en este momento.

algo más

1. El número de puerto de activeMq es 61616;

2. Para utilizar el tema, debe configurar spring.jms.pub-sub-domain = true;

3. Si no hay ningún consumidor en la cola, la información se almacenará en la cola;

4. Cuando el mensaje enviado es un objeto, el objeto necesita ser serializado, cuando el consumidor recibe la información del objeto, necesita usar ObjectMessage para la conversión;

5. Usando la propiedad containerFactory en la anotación JmsListener, puede configurar la propiedad spring.jms.pub-sub para recibir queque y tema al mismo tiempo;

6. La cola es un modelo peer-to-peer, tipic es un modelo de publicación-suscripción;

7. El nombre de la cola de mensajes (sms.queue y sms.topic) en el ejemplo se puede establecer como propiedades de configuración según sea necesario;

Dirección de origen: https://github.com/secbr/springboot-learn/tree/master/springboot-activemq
enlace al texto original: " Ejemplo detallado de SpringBoot Integrated ActiveMQ "

Artículo de referencia:

https://www.cnblogs.com/xiguadadage/p/11217604.html

https://blog.csdn.net/bihansheng2010/article/details/87190645

Video tutorial de Fine SpringBoot 2.x

"Spring Boot 2.x Video Tutorial Family Bucket" , un video tutorial boutique de Spring Boot 2.x, para crear el conjunto más completo de videos tutoriales de Spring Boot 2.x.


Nueva visión del procedimiento

La cuenta pública " Nueva Visión del Programa ", una plataforma que le permite mejorar simultáneamente su poder blando y su tecnología dura, proporcionando cantidades masivas de datos.

Cuenta oficial de WeChat: nueva visión del programa

Supongo que te gusta

Origin blog.csdn.net/wo541075754/article/details/108068496
Recomendado
Clasificación