¿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
Por supuesto, también se puede configurar a través del mensaje
Cuatro sobrecargas: destino, mensaje, prioridad, tiempo de vida, si persistir o no
. Destino del mensaje: cola y tema
Persistencia
El tiempo de caducidad del mensaje nunca caducará de forma predeterminada.
Cuerpo informado
发送的消息类型有哪些:
StringMessage MapMessage ByteMessage StringMessage ObjectMessage 五中类型
要求:发送的消息体和接受的消息体要求类型一致。
Requisito: el cuerpo del mensaje enviado y el cuerpo del mensaje recibido requieren el mismo tipo.
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
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
mensaje normalmente se consume.
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
cerrar el servidor, vaya a consumir el mensaje El
mensaje se pierde y no se puede consumir.
El mensaje que se acaba de generar se pierde
Verificación 3: Configure el mensaje para que sea persistente y luego genere el mensaje. Este es el mensaje que se acaba de generar.
Apague el servidor de mensajes, reinicie el mensaje nuevamente, el mensaje aún existe
para consumir el mensaje. El mensaje se consumió con éxito
(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
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
Servidor de mensajes
Verificación 2: Apagar el consumidor 1 e iniciar el consumidor 2 y el
consumidor 1 está desconectado y comienza el consumo del productor. El
consumidor 2 puede consumir mensajes normalmente.
Iniciar el consumidor 1 de nuevo y el consumidor 1 también puede consumir mensajes normalmente.
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.
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,
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
transacción se confirma, el
mensaje se pone en cola y la
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
para ver que se eliminan los mensajes persistentes.
El productor inicia la transacción y envía el mensaje al servidor de mensajes.
Al ver el mensaje, el
consumidor consume el mensaje.
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.
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,
pero ve en el servidor que el mensaje no se ha consumido.
Inicie otro consumidor de nuevo y descubra que el mensaje se puede consumir varias veces.
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. ? ?
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