Resumen de RabbitMQ (1) - cola de mensajes Modo de respuesta de RabbitMQ (automático, manual)

Enlace original

Modo de respuesta de cola de mensajes RabbitMQ (automático, manual)

Para garantizar que el mensaje no se pierda, RabbitMQ admite la respuesta de mensajes. El consumidor envía una respuesta de mensaje, diciéndole a RabbitMQ que el mensaje ha sido recibido y procesado. RabbitMQ puede eliminarlo.
Si un consumidor cuelga pero no envía una respuesta, RabbitMQ comprenderá que el mensaje no se ha procesado por completo y luego se lo entregará a otro consumidor para que lo vuelva a procesar. De esta manera, puede confirmar que no se perderán mensajes incluso si el consumidor cuelga ocasionalmente.
No hay límite de tiempo de espera de mensajes; RabbitMQ volverá a entregar solo cuando el consumidor cuelgue. Incluso procesar un mensaje llevará mucho tiempo.
La respuesta al mensaje está activada de forma predeterminada. Apagamos este mecanismo a través de la configuración mostrada autoAsk = true. La respuesta automática ahora está abierta, una vez que completemos la tarea, el consumidor enviará automáticamente una respuesta. Notifique a RabbitMQ que el mensaje se ha procesado y se puede eliminar de la memoria. Si el consumidor no envía un ACK debido al tiempo de inactividad o falla del enlace (a diferencia de ActiveMQ, en RabbitMQ, el mensaje no tiene concepto de vencimiento), RabbitMQ reenviará el mensaje al siguiente consumidor que esté escuchando en la cola.

 

Caso: El
código de productor permanece sin cambios y el código de consumidor se usa para habilitar el modo de respuesta manual.
channel.basicConsume (QUEUE_NAME, false, defaultConsumer);
Nota: El segundo valor del parámetro es falso, lo que significa que el mecanismo de respuesta automática de RabbitMQ está desactivado y la respuesta se cambia a respuesta manual.
Cuando se procesa el mensaje, se devuelve el estado de respuesta y verdadero representa el modo de respuesta automática.
channel.basicAck (sobre.getDeliveryTag (), falso);

 

Modo de respuesta: señal automática ~~~

Respuesta automática: se le indicará a la cola que elimine el mensaje independientemente de si el consumidor procesa el mensaje correctamente. Si el procesamiento del mensaje falla, realice una compensación automática (la entrega en cola se procesó nuevamente en el pasado).

Respuesta manual: una vez que el consumidor ha procesado la lógica empresarial, devuelve manualmente un ack (notificación) para indicarle a la cola que el procesamiento se ha completado y, a continuación, la cola elimina el mensaje.

El código de productor permanece sin cambios y el consumidor:

package com.toov5.Consumer;
 
import java.io.IOException;
import java.util.concurrent.TimeoutException;
 
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils;
 
public class Consumer {
  
     //队列名称
        private static final String QUEUE_NAME = "test_queue";
        
        public static void main(String[] args) throws IOException, TimeoutException {
            System.out.println("消费者启动..........");
            //创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
           //创建Channel
            Channel channel = connection.createChannel();
            // 消费者关联队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            
              DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {
                  //监听获取消息
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                            byte[] body) throws IOException {
                        String msg =new String(body,"UTF-8");
                        System.out.println("消费者获取生产者消息:"+msg);
                    }
              };
            //牵手模式设置  默认自动应答模式  true:自动应答模式  
              channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);//    fanse手动应答          
              
//            //关闭通道和连接
//             channel.close();
//             connection.close();
        }
}

Responde manualmente. En este momento, los mensajes de la cola de mensajes no se han borrado.

Modifique de la siguiente manera:

package com.toov5.Consumer;
 
import java.io.IOException;
import java.util.concurrent.TimeoutException;
 
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils;
 
public class Consumer {
  
     //队列名称
        private static final String QUEUE_NAME = "test_queue";
        
        public static void main(String[] args) throws IOException, TimeoutException {
            System.out.println("消费者启动..........");
            //创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
           //创建Channel
            final Channel channel = connection.createChannel();
            // 消费者关联队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            
              DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {
                  //监听获取消息
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                            byte[] body) throws IOException {
                        String msg =new String(body,"UTF-8");
                        System.out.println("消费者获取生产者消息:"+msg);
                        channel.basicAck(envelope.getDeliveryTag(), false);  //手动应答 告诉消息队列服务器 消费成功
                    }
              };
            //牵手模式设置  默认自动应答模式  true:自动应答模式  
              channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);//    fanse手动应答          
              
//            //关闭通道和连接
//             channel.close();
//             connection.close();
        }
}

 

 Este es el final del consumo

 

Supongo que te gusta

Origin blog.csdn.net/lsx2017/article/details/114004718
Recomendado
Clasificación