Especificaciones de JMS y características de los mensajes (1)

¿Qué es la especificación JMS?

它是JavaEE体系中的一项Message Service

Comparación de middleware de mensajes común

Composición y características de JMS

Proveedor JMS

实现jms接口的消息中间件

Productor JMS 、 Constómero JMS


Encabezado del mensaje JMS

1)jms destination 消息目的地 队列或者主题
2)jms deviverymode 持久化方式
3)jms expiration 消息过期时间 
4)jms 优先级 1到4是普通消息  5-9是加急消息
5)消息id  唯一识别每个消息的标识,是有MQ自己生成
El destino del encabezado del mensaje

Inserte la descripción de la imagen aquí
Por supuesto, también se puede configurar a través del mensaje
Inserte la descripción de la imagen aquí

Cuatro sobrecargas: destino, mensaje, prioridad, tiempo de vida, si persistir o no
. Destino del mensaje: cola y tema

Persistencia
Inserte la descripción de la imagen aquí
El tiempo de caducidad del mensaje nunca caducará de forma predeterminada.

Cuerpo informado

发送的消息类型有哪些:
StringMessage MapMessage ByteMessage StringMessage ObjectMessage 五中类型

要求:发送的消息体和接受的消息体要求类型一致。

Inserte la descripción de la imagen aquí
Requisito: el cuerpo del mensaje enviado y el cuerpo del mensaje recibido requieren el mismo tipo.
Inserte la descripción de la imagen aquí

Atributos de mensajes personalizados

自定义的消息属性能有什么还用呢 ?
去重、识别、重点标注等	

TextMessage textMessage = session.createTextMessage("myTopic……"+ i );
messageProducer.send(textMessage);
textMessage.setStringProperty("自定义消息的key", "自定义消息的value");

¿Cómo garantizar la fiabilidad del mensaje? ? ?

消息的可靠性可以从以下四个方面来回答:
1)消息的持久性
2)消息的事务特性
3)消息的签收机制
4)消息持久化

(Cola) Persistencia de mensajes

Inserte la descripción de la imagen aquí
Verificación 1:
configura el mensaje para que no sea persistente, luego genera el mensaje (el servidor no se apaga) y luego consume el mensaje. El
Inserte la descripción de la imagen aquí
mensaje normalmente se consume.
Inserte la descripción de la imagen aquí
Verificación 2:
configura el mensaje para que no sea persistente, luego genere el mensaje (el servidor está cerrado), y luego lo consuma Mensaje Mensaje
generado Después de
Inserte la descripción de la imagen aquí
cerrar el servidor, vaya a consumir el mensaje El
Inserte la descripción de la imagen aquí
mensaje se pierde y no se puede consumir.
El mensaje que se acaba de generar se pierde
Inserte la descripción de la imagen aquí
Verificación 3: Configure el mensaje para que sea persistente y luego genere el mensaje. Este es el mensaje que se acaba de generar.
Inserte la descripción de la imagen aquí
Apague el servidor de mensajes, reinicie el mensaje nuevamente, el mensaje aún existe
Inserte la descripción de la imagen aquí
para consumir el mensaje. El mensaje se consumió con éxito
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

(Tema) la persistencia del mensaje

Para los mensajes de tema, la persistencia no tiene mucho sentido, porque en el modo de tema, primero debe iniciar el consumidor y luego iniciar el productor. Si se establece la persistencia del mensaje, pero el consumidor no se ha iniciado, estos mensajes se perderán y no puede ser consumido por los consumidores

Configurar el generador de temas persistentes

package com.ttzz.activemq;

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;

public class ActiveMQProduceByTopic {
    
    
	public static String url = "tcp://localhost:61616";
	public static String topicName = "myTopic";
	
	public static void main(String[] args) throws JMSException {
    
    
		//1.获取工厂
		ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
		//2. 创建连接
		Connection connection = activeMQConnectionFactory.createConnection();
		
		//3.创建会话
		// 第一个参数 是否开启开启事务
		// 第二个参数 是签收模式
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//4. 创建目的地 Topic 
		Topic topic =session.createTopic(topicName);
		//5. 创建生产者
		MessageProducer messageProducer = session.createProducer(topic);
		
		messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
		connection.start();
		//6. 发送消息
		for (int i = 0; i < 4; i++) {
    
    
			TextMessage textMessage = session.createTextMessage("myTopic……"+ i );
			textMessage.setStringProperty("自定义消息的key", "自定义消息的value");
			messageProducer.send(textMessage);
		}
		//关闭资源
		messageProducer.close();
		session.close();
		connection.close();
		System.out.println("OOKK");
	}
}

consumidor de temas

package com.ttzz.activemq;

import java.io.IOException;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicSubscriber;

import org.apache.activemq.ActiveMQConnectionFactory;

public class ActiveMQConsumerByTopic {
    
    
	public static String url = "tcp://localhost:61616";
	public static String topicName = "myTopic";

	public static void main(String[] args) throws JMSException, IOException {
    
    
		// 1.获取工厂
		ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
		// 2. 创建连接
		Connection connection = activeMQConnectionFactory.createConnection();
		
		connection.setClientID("消费者1");
		System.out.println("topic消费者1");
		
		// 3.创建会话
		// 第一个参数 是否开启开启事务
		// 第二个参数 是签收模式
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 4. 创建目的地Topic
		Topic topic = session.createTopic(topicName);
		// 5. 创建消费者
		TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "remark..."); // 创建持久化的订阅

		connection.start();

		Message message = topicSubscriber.receive();
		while (message != null) {
    
    
			TextMessage textMessage = (TextMessage) message;
			System.out.println(textMessage.getText());
			message = topicSubscriber.receive();
		}

		session.close();
		connection.close();
		System.out.println("OOKK2");
	}
}

Verificación 1: Iniciar un consumidor
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Suscriptores de temas activos y duraderos: consumidores de temas persistentes en estado activo
Suscriptores de temas duraderos sin conexión: consumidores de temas persistentes en estado fuera de línea
Iniciar generadores de temas persistentes: los
consumidores de temas consumen mensajes
Inserte la descripción de la imagen aquí
Servidor de mensajes
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Verificación 2: Apagar el consumidor 1 e iniciar el consumidor 2 y el
Inserte la descripción de la imagen aquí
consumidor 1 está desconectado y comienza el consumo del productor. El
Inserte la descripción de la imagen aquí
consumidor 2 puede consumir mensajes normalmente.
Inserte la descripción de la imagen aquí
Iniciar el consumidor 1 de nuevo y el consumidor 1 también puede consumir mensajes normalmente.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Características de transacción del mensaje

La transacción es principalmente para el productor y la firma es principalmente para el consumidor.

	//3.创建会话
	// 第一个参数 是否开启开启事务
	// 第二个参数 是签收模式
	Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

Verificación 1: la
transacción se establece en falsa y el mensaje se envía al servidor automáticamente.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Debido a que se establece la persistencia del mensaje, el servidor se apaga y se reinicia nuevamente, el mensaje aún existe

Verificación 2: la
transacción se establece en verdadera, se envía la ejecución del mensaje,
Inserte la descripción de la imagen aquí

Vea si el servidor recibe el mensaje. El mensaje que se acaba de enviar no se recibió del servidor. Debido a que no hay una operación de confirmación de mensaje, la
Inserte la descripción de la imagen aquí
transacción se confirma, el
Inserte la descripción de la imagen aquí
mensaje se pone en cola y la
Inserte la descripción de la imagen aquí
transacción se envía para varios mensajes al mismo tiempo, lo que puede garantizar la atomicidad de
session.rollback ();

Para verificar la necesidad, cuando necesite reiniciar, elimine el mensaje persistente

Operación: Agregue deleteAllMessagesOnStartup = "true" en el campo de intermediario del archivo de configuración activemq.xml
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
para ver que se eliminan los mensajes persistentes.

El productor inicia la transacción y envía el mensaje al servidor de mensajes.
Inserte la descripción de la imagen aquí
Al ver el mensaje, el
Inserte la descripción de la imagen aquí
consumidor consume el mensaje.
Inserte la descripción de la imagen aquí
Inicia un consumidor de nuevo y descubre que el mensaje se ha consumido, lo que indica que el mensaje no se puede volver a consumir.
Inserte la descripción de la imagen aquí
Verificación 2: Configure el consumidor para que inicie la transacción, pero sin envío Transacción [el mensaje se consume repetidamente]. Por primera vez, el consumidor 1 consume el mensaje normalmente,
Inserte la descripción de la imagen aquí
pero ve en el servidor que el mensaje no se ha consumido.
Inserte la descripción de la imagen aquí
Inicie otro consumidor de nuevo y descubra que el mensaje se puede consumir varias veces.
Inserte la descripción de la imagen aquí

Un fenómeno interesante

El productor envía al productor al servidor de manera transaccional, el
consumidor inicia la transacción para el consumo, pero la transacción no se compromete. Asegúrese de que el control sea indestructible. Volví a empezar con el segundo consumidor y descubrí que no puedo repetir el consumo. ? ?
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Si (remove: System.in.read ();) después de configurar el consumidor durante 4 segundos, no hay ningún mensaje, se cerrará automáticamente. El consumidor nº 2 está activado y se puede utilizar repetidamente.
¿La razón? ? ? Jajajaja

Supongo que te gusta

Origin blog.csdn.net/weixin_39472101/article/details/114993631
Recomendado
Clasificación