Résumé RabbitMQ (1) - file d'attente de messages Mode de réponse RabbitMQ (automatique, manuel)

Lien d'origine

File d'attente de messages Mode de réponse RabbitMQ (automatique, manuel)

Afin de garantir que le message ne sera pas perdu, RabbitMQ prend en charge la réponse de message. Le consommateur envoie une réponse de message, indiquant à RabbitMQ que le message a été reçu et traité. RabbitMQ peut le supprimer.
Si un consommateur raccroche mais n'envoie pas de réponse, RabbitMQ comprendra que le message n'a pas été complètement traité, puis le remettra à un autre consommateur pour le retraiter. De cette façon, vous pouvez confirmer qu'aucun message ne sera perdu même si le consommateur raccroche occasionnellement.
Il n'y a pas de limite de délai d'expiration des messages; RabbitMQ ne re-délivrera que lorsque le consommateur raccroche. Même le traitement d'un message prendra beaucoup de temps.
La réponse au message est activée par défaut. Nous désactivons ce mécanisme via le paramètre affiché autoAsk = true. La réponse automatique est maintenant ouverte, une fois que nous avons terminé la tâche, le consommateur enverra automatiquement une réponse. Informez RabbitMQ que le message a été traité et peut être supprimé de la mémoire. Si le consommateur n'envoie pas un ACK en raison d'un temps d'arrêt ou d'une défaillance de liaison (contrairement à ActiveMQ, dans RabbitMQ, le message n'a pas de concept d'expiration), RabbitMQ renverra le message au prochain consommateur écoutant dans la file d'attente.

 

Cas: le
code producteur reste inchangé et le code consommateur est utilisé pour activer le mode de réponse manuelle.
channel.basicConsume (QUEUE_NAME, false, defaultConsumer);
Remarque: La deuxième valeur du paramètre est false, ce qui signifie que le mécanisme de réponse automatique de RabbitMQ est désactivé et que la réponse est remplacée par une réponse manuelle.
Lorsque le message est traité, l'état de la réponse est renvoyé et true représente le mode de réponse automatique.
channel.basicAck (enveloppe.getDeliveryTag (), false);

 

Mode de réponse: signe automatique ~~~

Réponse automatique: la file d'attente sera informée de supprimer le message, que le consommateur le traite ou non avec succès. Si le traitement du message échoue, effectuez une compensation automatique (la remise de la file d'attente a été traitée à nouveau dans le passé).

Réponse manuelle: une fois que le consommateur a traité la logique métier, il renvoie manuellement un accusé de réception (notification) pour indiquer à la file d'attente que le traitement est terminé, puis la file d'attente supprime le message.

Le code producteur reste inchangé et le consommateur:

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();
        }
}

Répondez manuellement. Pour le moment, les messages de la file d'attente des messages n'ont pas été effacés

Modifiez comme suit:

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();
        }
}

 

 C'est la fin de la consommation

 

Je suppose que tu aimes

Origine blog.csdn.net/lsx2017/article/details/114004718
conseillé
Classement