路由模式中,消费者指定错误的路由key或者不指定,依然能接收到消息!我惊了

上一篇路由模式的学习,对最后一句话,不太确定,自己进行了测试,如下

测试非指定的routingkey

消费者绑定交换机时,指定错误的routingkey

//生产者:
//队列绑定交换机
            channel.queueBind(DIRECT_QUEUE_INSERT, DIRECT_EXCHANGE, "insert");
            channel.queueBind(DIRECT_QUEUE_UPDATE, DIRECT_EXCHANGE, "update");
//测试消费者
		//队列绑定交换机
            channel.queueBind(DIRECT_QUEUE_INSERT,DIRECT_EXCHANGE,"test");            

启动上述的生产者
查看web管理页面
在这里插入图片描述
发送了一条新增的消息,未被消费

启动测试消费者

import com.ql.ConnectionUtil;
import com.rabbitmq.client.*;

import java.io.IOException;

import static com.ql.routing.ProducerDemo.DIRECT_EXCHANGE;
import static com.ql.routing.ProducerDemo.DIRECT_QUEUE_INSERT;

/**
 * @Description: TODO
 * @author: qinlei
 * @date: 2020年05月13日 15:09
 */
public class ConsumerTestDemo {
    public static void main(String[] args) {
        try {
            Connection connection = ConnectionUtil.getConnection();
            //创建通道
            Channel channel = connection.createChannel();
            //声明交换机 路由模式的
            channel.exchangeDeclare(DIRECT_EXCHANGE,BuiltinExchangeType.DIRECT);
            //创建队列
            channel.queueDeclare(DIRECT_EXCHANGE,true,false,false,null);
            //队列绑定交换机
            channel.queueBind(DIRECT_QUEUE_INSERT,DIRECT_EXCHANGE,"test");
            //监听消息
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
                /*
                consumerTag消息者标签 在channel.basicConsume时候可以指定
                envelope消息内容 可从中获取消息id,消息routingkey 交换机  消息和重转标记(收到消息失败后是否需要重新发送)
                properties 消息属性
                body 消息体
                 */
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println(consumerTag);
                    System.out.println(envelope.toString());
                    System.out.println(properties.toString());
                    System.out.println("新增--消费者:=====消息内容:" + new String(body));
                }
            };
            /*
            监听消息
            参数一:队列名称
            参数二:是否自动确认 设置为true表示消息接收到自动向mq回复接收到了
             */
            channel.basicConsume(DIRECT_QUEUE_INSERT,true,defaultConsumer);
        }catch (Exception e){}

    }
}

该测试用例仅修改了绑定交换机时的路由key 且该key生产者中没有
启动后的控制台结果:
在这里插入图片描述
此时:web管理页面中的消息确实被消费了
在这里插入图片描述

指定空的routingkey

//测试消费者
//队列绑定交换机
            channel.queueBind(DIRECT_QUEUE_INSERT,DIRECT_EXCHANGE,"");

生产者不变
启动消费者,启动生产者
在这里插入图片描述
依然可被消费

我惊了!

不是说好的接收不到吗?!


解决!!

昨晚又对rabbitmq的流程好好学习了下.

路由模式与之前的工作队列及简单队列的不同在于生产者发送消息时,是发送给交换机而不是对列
而我在写demo时,在生产者中绑定了队列,
这样的话,消息不经过交换机直接到达队列.所以routingKey就无意义!
根本就不经过他的匹配!!
所以会出现如题的情况
正确的生产者应该是:

import com.ql.ConnectionUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * @Description: TODO
 * @author: qinlei
 * @date: 2020年05月07日 9:59
 */
public class ProducerDemo {

    static final String DIRECT_EXCHANGE = "direct_exchange";
    static final String DIRECT_QUEUE_INSERT = "direct_queue_insert";
    static final String DIRECT_QUEUE_UPDATE = "direct_queue_update";

    public static void main(String[] args) {
        try {
            //创建连接
            Connection connection = ConnectionUtil.getConnection();
            //创建通道
            Channel channel = connection.createChannel();
            /*
            生命交换机  之前的消息直接发送至queue  发布与订阅模式 是先发送到交换机
            参数1:交换机名称
            参数2:交换机类型: fanout topic direct headers
             */
            channel.exchangeDeclare(DIRECT_EXCHANGE, BuiltinExchangeType.DIRECT);
            /*##################################################################
            ########### 因为不是向队列发送,所以不需要创建队列,也不需要针对队列绑定交换机##
            ####################################################################
            */
            //创建队列 不需要创建队列      
            /*
            参数一:队列名称
            参数二:是否持久化队列
            参数三:是否独占本次连接
            参数四:是否在不使用的时候自动删除队列
            参数五:队列其他参数
             */
//            channel.queueDeclare(DIRECT_QUEUE_INSERT, true, false, false, null);
            //队列绑定交换机 不需要绑定
//            channel.queueBind("", DIRECT_EXCHANGE, "update");

            //要发送的消息 新增
            String msg = "这是一条修改消息---路由模式";
            //发送至交换机 指定路由名称为 insert
            channel.basicPublish(DIRECT_EXCHANGE, "update", null, msg.getBytes());
            System.out.println("修改消息已发送----路由模式");


            channel.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这里也对之前学习文章的路由模式DEMO代码进行修改…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qlanto

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值