如果生产端指定的路由key和队列可以发送给mq ,那么消费端只要指定了这个队列,路由key是错的也可以消费这个消息?

来源:3-6 Return返回消息详解

慕运维9484465

2020-05-26

生产端
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory= new ConnectionFactory();
connectionFactory.setHost(“192.168.44.140”);
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");

    Connection connection = connectionFactory.newConnection();
    Channel channel= connection.createChannel();
    String exchange="test_return_exchange";
    String routingKey="test.return.test1";
    String msg="测试return";
    channel.addReturnListener(new ReturnListener() {
        public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException {
            System.out.println("replyCode="+replyCode);
            System.out.println("replyText="+replyText);
            System.out.println("exchange="+exchange);
            System.out.println("routingKey="+routingKey);
            System.out.println("properties="+properties);
            System.out.println("body="+new String(body));

        }
    });

    //mandatory  为true时无法路由的消息会被监听   可通过addReturnListener监听到
    channel.basicPublish(exchange,routingKey,true,null,msg.getBytes());
}

消费端
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
ConnectionFactory connectionFactory= new ConnectionFactory();
connectionFactory.setHost(“192.168.44.140”);
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");

    Connection connection = connectionFactory.newConnection();
    Channel channel= connection.createChannel();
    String exchange="test_return_exchange";
    String routingKey="test.return";

    channel.exchangeDeclare(exchange,"topic",true,false,null);
    channel.queueDeclare("test_return_queue",true,false,false,null);
    channel.queueBind("test_return_queue",exchange,routingKey);

    QueueingConsumer queueingConsumer= new QueueingConsumer(channel);
    channel.basicConsume("test_return_queue",true,queueingConsumer);

    while(true){
        QueueingConsumer.Delivery delivery= queueingConsumer.nextDelivery();
        String msg = new String(delivery.getBody());
        System.err.println("消费端消费消息"+msg);
    }

}

控制台
图片描述

写回答

1回答

阿神

2020-05-27

你现在是绑定了多个路由key 哪个都可以

0
1
慕运维9484465
消费端绑定的路由key即使对不上,只要是这个队列能接受到的消息,也就以为着也可以消费,这样问
2020-05-27
共1条回复

RabbitMQ精讲 从0到1驾驭RabbitMQ应用与设计

从0到1,全面深入掌握RabbitMQ消息中间件技术

1460 学习 · 443 问题

查看课程