RabbitMq在发布/订阅模式下:不声明消费者,returnCallback回调未触发情况下,消息未堆积在队列中?

59 阅读1分钟

RabbitMq在发布/订阅模式下:不声明消费者,returnCallback回调未触发情况下,消息未堆积在队列中

1.发布/订阅模式下:不声明消费者,confirmCallback回调正常,returnCallback回调也没触发,若是发送大量消息看得到rabbitmq后台Message rates的deliver / get 指标中有大量数据飘过,但是Messages各指标一直都是0。
2.简单队列模型下不声明消费者的情况下,发送消息,消息正常存储在队列中。

@Configuration
public class TopicConfig {
    /**
     * 声明交换机
     * @return Topic类型交换机
     */
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("change.topic");
    }

    /**
     * 第1个队列
     */
    @Bean
    public Queue topicQueue(){
        return new Queue("topic.queue");
    }

    /**
     * 绑定队列和交换机
     */
    @Bean
    public Binding bindingTopicQueue(Queue topicQueue, TopicExchange topicExchange){
        return BindingBuilder.bind(topicQueue).to(topicExchange).with("#.id");
    }
}
@Test
    public void testMessageConfirm(){
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             * @param b 代表交换机是否成功收到了消息,true代表成功,false代表失败
             * @param s 代表失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                System.out.println(b);

//                System.out.println("confirm 方法被执行了");
                if(b){
                    //接收成功
                    System.out.println("消息成功接收");

                }else {
                    System.out.println("消息接受失败,"+s);

                }
            }
        });
        /**
         * 这个回执是相对于队列的。当消息发送给Exchange后,Exchange路由到Queue失败后才会执行ReturnCallBack。
         */
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println("消息对象:"+message);
                System.out.println("错误码:"+replyCode);
                System.out.println("错误信息:"+replyText);
                System.out.println("交换机:"+exchange);
                System.out.println("路由键:"+routingKey);
                System.out.println("return执行了...");
            }
        });
        //发送一条消息
        for (int i = 0; i < 100; i++) {
            //以下执行,上述ReturnCallback未触发,但是消息未堆积在队列中。
            rabbitTemplate.convertAndSend("change.topic","user.id","hello,_"+i);
            //以下执行,消息正常存储在指定队列中
            rabbitTemplate.convertAndSend("simple.queue","hello,_"+i);
        }
    }

image.png 实在不太清楚第一个情况是为什么?若哪位大佬清楚的,希望有后续解答,多谢。