ActiveMQ ----- > Cómo garantizar la confiabilidad de los mensajes

Resistencia

1.1 Configuración de API

Java默认是持久化的

 

1.2 Persistencia del tema

默认En este caso, cuando se publica el tema, si el suscriptor no está en línea.消息就会丢失

Pero podemos usar Topic persistente para resolver este problema.

先启动订阅在启动生产

Productor

public class TopicProducer {
    public static final String ACTIVE_URL = "tcp://192.168.6.10:61616";
    public static final String TOPIC_NAME = "topic01";
 
    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVE_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
 
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        Topic topic = session.createTopic(TOPIC_NAME);
 
        MessageProducer producer = session.createProducer(topic);
        //与之前的实现没有区别,只是将消息设置为持久化后再开始连接即可
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        connection.start();
        for (int i = 0; i < 3; i++) {
            TextMessage textMessage = session.createTextMessage("msg---" + i);
            producer.send(textMessage);
        }
 
        producer.close();
        session.close();
        connection.close();
        System.out.println("发送持久化topic完成~");
 
    }
}

abonado

public class TopicConsumer {
    public static final String ACTIVE_URL = "tcp://192.168.6.10:61616";
    public static final String TOPIC_NAME = "topic01";
    
    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVE_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        //要设置一个订阅该主题的订阅者Id
        connection.setClientID("ww");
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        Topic topic = session.createTopic(TOPIC_NAME);
        //这里与之前不同,要通过session创建一个持久化的订阅者
        //参数为订阅的主题与备注
        TopicSubscriber t = session.createDurableSubscriber(topic, "我是ww");
        connection.start();
        //阻塞式接收消息
        Message message = t.receive();
 
        while(message != null){
            TextMessage textMessage = (TextMessage) message;
            System.out.println("收到的持久化topic :"+textMessage.getText());
            message = t.receive();
        }
 
 
    }
 
}

Dos asuntos

Productor de transacciones

2.1 Asuntos del productor

La prioridad de configuración de la transacción es mayor que el modo de respuesta (firma)

		//第一个参数是是否创建session,第二个参数表示应答模式
        Session session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);

Cuando la transacción no se abre,
siempre que se ejecute el envío, ingresa a la cola

Después de abrir la transacción,
debe usarse al final session.commit();, y también se puede usar una excepciónsession.rollback();

2.2 Asuntos del consumidor

Cuando la transacción no se abre, el
mensaje se considera consumido

Cuando no se abre la transacción , el mensaje no se contará como consumido. Puede ser posible
commit重复消费的

 

La importancia de la apertura de transacciones es que si se deben transmitir varios mensajes en el mismo lote, se pueden usar transacciones. Si una transmisión falla, la transacción se puede revertir y transmitir nuevamente para garantizar la integridad de los datos .

1) Para productores

El productor de mensajes se centra en las transacciones. Después de que se abre la transacción, el mensaje enviado se enviará al servidor solo después de que la sesión ejecute el compromiso, de lo contrario, no será válido.

2) Para consumidores

Los consumidores prefieren firmar , pero después de que se abre la transacción, si el mensaje se consume solo está relacionado con si el mensaje está confirmado o no. El mensaje se firmará automáticamente después de la confirmación. Si se revierte, el mensaje seguirá siendo transmitido. Si la transacción no se abre, debe aprobarse. Firmar para el consumo de mensajes (mencionado a continuación)
 

 

Tres firman para

Firmar para consumidores parciales

3.1 Modo no transaccional

Signo automático (predeterminado)

Sesión.AUTO_ACKNOWLEDGE

Señal manual

Señal manual del método de
llamada del cliente Session.CLIENT_ACKNOWLEDGEacknowledge

La firma generalmente tiene efecto en un estado no transaccional, y es principalmente para los consumidores. La función de firma del productor no tiene sentido, porque si la transacción se abre, la firma depende de si se envía y se revierte.

Hay cuatro estados de recepción y los dos estados de recepción más utilizados.

En el estado no transaccional, si se establece una señal manual, debe firmarse después de que la recepción reciba un mensaje; de ​​lo contrario, el mensaje aún no se consume y el mensaje sin firmar aún se puede obtener durante el siguiente consumo.

Permitir mensajes duplicados


Sesión.DUPS_OK_ACKNOWLEDGE

El mensaje se puede confirmar repetidamente, lo que significa que en este modo, puede haber mensajes repetidos, y no es que un mensaje necesite enviar múltiples ACK. Es un mecanismo de confirmación potencial "AUTO_ACK", nacido para la confirmación de lotes, y tiene las características de confirmación "retrasada". Para los desarrolladores, la estructura del código en este modo es la misma que AUTO_ACKNOWLEDGE, y no es necesario llamar al método de reconocimiento () para confirmar el mensaje como CLIENT_ACKNOWLEDGE.

 En el modo de transacción, la
transacción del consumidor está activada. Solo después de la confirmación se pueden consumir todos los mensajes. Escribir un acuse de recibo no tiene ningún efecto. Incluso si el recibo está escrito, no firmará y dejará el equipo.

 

 Conexión
con transacciones En las conversaciones transaccionales, cuando una transacción se confirma con éxito, el mensaje se firma automáticamente. Si la transacción se revierte, el mensaje se enviará nuevamente. En una
sesión no transaccional, cuando se confirma el mensaje depende del modo de reconocimiento cuando se crea la sesión (reconocimiento)
 

Resumen: cuatro formas de garantizar la confiabilidad de los mensajes en ActiveMQ

 

1) Persistencia de mensajes: la cola tiene como valor predeterminado la persistencia y se requieren configuraciones manuales en el modo de tema

2) Abra la transacción del mensaje

3) En el estado no transaccional del consumidor, la función de firma manual de mensajes debe estar activada

4) Construcción de clústeres para lograr una alta disponibilidad.

 

Supongo que te gusta

Origin blog.csdn.net/m0_46405589/article/details/115078495
Recomendado
Clasificación