RabbitMQ (六) 订阅者模式之路由模式 ( direct )

路由模式下,生产者发送消息时需要指定一个路由键(routingKey),交换机只会把消息转发给包含该路由键的队列

 

 

这里,我们改变一下声明交换机的方式.

我们通过管理后台添加一个交换机.

 

添加后,生产者和消费者的代码中就不需要再声明交换机了.同样,也可以通过管理后台添加队列,那么代码中也不需要声明队列了.

生产者 

复制代码
复制代码
    public class Producer
    {

        private const string ExchangeName = "test_exchange_direct";

        public static void Send()
        {
            IConnection connection = ConnectionHelper.GetConnection();
            IModel channel = connection.CreateModel();  
            string msg = "hello world ";

            //把消息发送到交换机,交换机再转发到包含路由键"refuge"的队列.
            channel.BasicPublish(ExchangeName, "refuge", null, Encoding.Default.GetBytes(msg));
            Console.WriteLine($"send {msg}");
            
            channel.Close();
            connection.Close();
        }
    }
复制代码
复制代码

 

消费者1

复制代码
复制代码
    public class Consumer1
    {
        private const string QueueName = "test_exchange1_queue";
        private const string ExchangeName = "test_exchange_direct";

        public static void Receive()
        {
            //获取连接
            RabbitMQ.Client.IConnection connection = ConnectionHelper.GetConnection();

            //创建通道
            RabbitMQ.Client.IModel channel = connection.CreateModel();

            //声明队列
            channel.QueueDeclare(QueueName, false, false, false, null);

            //声明交换机
            //channel.ExchangeDeclare(ExchangeName, "direct", false, false, null);

            //将队列绑定到交换机上,路由键为"wjire"
            channel.QueueBind(QueueName, ExchangeName, "wjire", null);

            //添加消费者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);

            //注册事件
            consumer.Received += (s, e) =>
            {
                byte[] bytes = e.Body;
                string str = Encoding.Default.GetString(bytes);
                Console.WriteLine("consumer1 : " + str);
            };

            //监听队列
            channel.BasicConsume(QueueName, true, "", false, false, null, consumer);
        }
    }
复制代码
复制代码

 

消费者2

复制代码
复制代码
    public class Consumer2
    {
        private const string QueueName = "test_exchange2_queue";
        private const string ExchangeName = "test_exchange_direct";
        public static void Receive()
        {
            //获取连接
            RabbitMQ.Client.IConnection connection = ConnectionHelper.GetConnection();

            //创建通道
            RabbitMQ.Client.IModel channel = connection.CreateModel();

            //声明队列
            channel.QueueDeclare(QueueName, false, false, false, null);

            //声明交换机
            //channel.ExchangeDeclare(ExchangeName, "direct", false, false, null);

            //将队列绑定到交换机上,该队列匹配两个路由键,"refuge"和"wjire"
            channel.QueueBind(QueueName, ExchangeName, "refuge", null);
            channel.QueueBind(QueueName, ExchangeName, "wjire", null);

            //添加消费者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);

            //注册事件
            consumer.Received += (s, e) =>
            {
                byte[] bytes = e.Body;
                string str = Encoding.Default.GetString(bytes);
                Console.WriteLine("         consumer2 : " + str);
            };

            //监听队列
            channel.BasicConsume(QueueName, true, "", false, false, null, consumer);
        }
    }
复制代码
复制代码

 

运行结果:

 

可以看到,只有消费者2消费了消息.

posted @   星火撩原  阅读(94)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2019-12-15 xen原理
2019-12-15 EXSI的使用
2019-12-15 VMWare ESX server安装
2019-12-15 虚拟化技术
点击右上角即可分享
微信分享提示