RabbitMQ:setReturnListner handleBasicReturn未收到未送达邮件的呼叫

RabbitMQ:setReturnListner handleBasicReturn未收到未送达邮件的呼叫,rabbitmq,Rabbitmq,对于其中一个需求,我们需要跟踪队列深度和成功处理的消息。其思想是发布消息并获得成功和失败消息的列表。为了模拟需求,我做了以下操作 发布带有强制和即时标志sent channel.basicPublish'exchange','rKey',true,false,props,“Hello World.”字节的消息 消费者使用偶数标记(我将1..10中的数字作为标记值放在每条消息的标题中),而不确认奇数消息 我在发布服务器中实现了setReturnListnere以捕获未送达的消息 虽然我能够通过Ra

对于其中一个需求,我们需要跟踪队列深度和成功处理的消息。其思想是发布消息并获得成功和失败消息的列表。为了模拟需求,我做了以下操作

  • 发布带有强制和即时标志sent channel.basicPublish'exchange','rKey',true,false,props,“Hello World.”字节的消息
  • 消费者使用偶数标记(我将1..10中的数字作为标记值放在每条消息的标题中),而不确认奇数消息
  • 我在发布服务器中实现了setReturnListnere以捕获未送达的消息
  • 虽然我能够通过Rabbmitmqctl list_queues messages_unacknowledged获取未确认消息的数量,但不知何故,我的handleBasicReturn方法没有被调用。我错过了什么

    代码片段:

    制作人:

    channel.setReturnListener(new ReturnListener() {
        public void handleBasicReturn(int replyCode, String replyText, String exchange,
                                      String routingKey, AMQP.BasicProperties properties,
                                      byte[] body) 
                throws IOException {
            println "Debugging messages!!!!"
            println "The details of returned messages are ${replyText} from  ${exchange} with routingKey as ${routingKey} with properties"
        }
    });
    
    println " queuename is ${dec.queue} and consumerCount is ${dec.consumerCount} messageCount is ${dec.messageCount}"
    (1..10).each {
        println "Sending file ${i}....."
        def headers = new HashMap<String,Object>()
        headers.put "operatiion","scp"
        headers.put "dest","joker.dk.mach.com"
        headers.put "id", i
        println headers
    
        BasicProperties props = new BasicProperties(null, null, headers, null, null, null, null, null,null, null, null, null,null, null)
                        channel.basicPublish 'exchange' ,'rKey',true,false, props,"Hello Worls".bytes                                
        i++                         
    }
    channel.close()
    
    了解即时和强制标志如何影响RabbitMQ中的消息传递

    在您的情况下,因为您有一个消费者正在接收消息,所以即使消费者从未确认消息,消息也不会返回

    D

    while (true) {
        def delivery = consumer.nextDelivery()
        def headers = delivery?.properties?.headers
        def id = headers.get("id")
        println "Received message:"
        println " ${id.toString()}"
    
        if( id % 2 == 0){
            channel.basicAck delivery.envelope.deliveryTag, false                
        }    
    }