美文网首页
RabbitMQ中topic模式下设置的routingKey范围

RabbitMQ中topic模式下设置的routingKey范围

作者: 倚仗听江 | 来源:发表于2020-11-27 10:49 被阅读0次

在使用RabbitMQ的topic模式时,发现不管怎么改变路由键的范围,消费者都能获取消息,先看一下代码
生产者:

public class Send {

    private static final String EXCHANGE_NAME = "topic_exchange";
    private static final String ROUTE_KEY = "red.apple.ss";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
        String msg = "topic exchange";
        channel.basicPublish(EXCHANGE_NAME, ROUTE_KEY, null, msg.getBytes());
        System.out.println(" [x] Sent '" + msg + "'");
        channel.close();
        connection.close();
    }
}

消费者

public class Recv1 {

    private static final String EXCHANGE_NAME = "topic_exchange";
    private static final String QUEUE_NAME = "apple_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "*.apple.*");
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String msg = new String(body);
                System.out.println(envelope.getRoutingKey());
                System.out.println(" [消费者1] received : " + msg + "!");
            }
        };
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

此时生产者绑定的路由键为red.apple.ss,而消费者绑定的路由键为*.apple.*,此时消费者能获取到消息。


image.png

到这里都很正常,但是我把消费者绑定的路由键改为*.banana.*后,消费者居然还能获取到消息


image.png
这就很不科学,后来发现,其实导致这个问题的原因就在于多次在代码里改变了routingkey的范围,每次更改都会在RabbitMQ中添加范围,但代码修改后,该范围仍然存在。虽然我后来把路由键的范围改为了*.banana.*,但 *.apple.* 的范围依旧存在,也就是说同时绑定了两个路由键。所以我们只要去RabbitMQ控制页面Exchange里bindings里的绑定删掉,重新运行即可。
image.png

果然这里绑定了两个路由键,删掉范围为*.apple.*的路由键,重新运行,就接收不到消息了,问题解决。

相关文章

网友评论

      本文标题:RabbitMQ中topic模式下设置的routingKey范围

      本文链接:https://www.haomeiwen.com/subject/gvtxwktx.html