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消费了消息.

原文地址:https://www.cnblogs.com/refuge/p/10350926.html

时间: 2024-08-26 18:39:02

RabbitMQ (六) : 订阅者模式之路由模式 ( direct )的相关文章

路由器的nat模式、路由模式和全模式

NAT模式.此模式下,由局域网向广域网发送的数据包默认经过NAT转换,但路由器对所有源地址与局域网接口不在同一网段的数据包均不进行处理.例如,路由器LAN口IP设置为192.168.1.1,子网掩码为255.255.255.0,LAN口所处网段为192.168.1.0/24,此时,路由器收到源地址为192.168.1.123的数据包会进行NAT转换:但如果收到源地址为20.31.76.80的数据包则直接丢弃. 路由模式.此模式下,处于不同网段的主机可以通过相应的路由设置进行通信,但路由器不进行N

RabbitMQ学习第四记:路由模式(direct)

1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机推送过来的数据.而路由模式下加了一个路由设置,生产者向交换机发送数据时,会声明发送给交换机下的那个路由,并且只有当消费者的队列绑定了交换机并且声明了路由,才会收到数据.下图取自于官方网站(RabbitMQ)的路由模式的图例 P:消息的生产者 X:交换机 红色:队列 C1,C2:消息消费者 error

nat模式、路由模式,网桥模式

路由器的几种连接方式 NAT英文全称是"Network Address Translation",中文意思是"网络地址转换",它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上.顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术. 简单的说,NAT就是在局域网内部网络中使用内部地

python使用rabbitMQ介绍四(路由模式)

一.模式介绍 路由模式,与发布-订阅模式一样,消息发送到exchange中,消费者把队列绑定到exchange上. 这种模式在exchange上添加添加了一个路由键(routing-key),生产者发布消息的时候添加路由键(routing-key),消费者绑定队列到交换机时添加键值(routing-key),这样就可以接收到对应的消息. 路由模式的direct exchange. 队列模型: 与发布-订阅模式不同的是,每个消费者队列接收的消息不同,根据消息的routing-key把消息发送到不同

RabbitMQ (七) : 订阅者模式之主体模式 ( topic )

主体模式和路由模式很像 路由模式是精确匹配 主体模式是模糊匹配 依然先通过管理后台添加一个交换机. 生产者 public class Producer { private const string ExchangeName = "test_exchange_topic"; public static void Send() { //获取一个连接 IConnection connection = ConnectionHelper.GetConnection(); //从连接中获取一个通道

RabbitMQ使用场景_004_路由模式

路由模式 queue只感兴趣这个的exchange.只希望接收交换机中的关键信息,或者说指定内容的信息, 而忽略交换机中的其他消息. direct exchange背后的路由算法很简单--即一个消息的队列binding_key完全匹配message的routing_key. 交换机绑定不同key的队列: 在上图中: exchange X和两个queue绑定在一起.queue Q1的binding key是orange.queue Q2的binding key是black和green. 当P pu

第六课 路由之路由模式

1 路由模式 (如上图:路由模式思维导图(TP5.0当中需要配置url_route_on)) 1.1普通模式(5.0之前的版本存在) 普通模式,又叫常规模式或传统模式,就是不开启路由功能时访问模式,也就是我们所说的PATHINFO模式 例子: .2 混合模式 混合模式,又叫兼容模式.只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的 PATH_INFO 模式访问URL. 注:如果是5.0之前的版本 需要把thinkphp\convention.php中的'url_ro

RabbitMQ六种队列模式-简单队列模式

前言 RabbitMQ六种队列模式-简单队列 [本文]RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主题模式 在官网的教程中,描述了如上六类工作队列模式: 简单队列模式:最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列.也称为点对点模式 工作模式:一个消息生产者,一个交换器,一个消息队列,多个消费者.同样也称为点对点模式 发布/订阅模式:无选择接收消息,一个消息生产者,一个交换器,多个

程序的加载和执行(六)——《x86汇编语言:从实模式到保护模式》读书笔记26

程序的加载和执行(六)--<x86汇编语言:从实模式到保护模式>读书笔记26 通过本文能学到什么? NASM的条件汇编 用NASM编译的时候,通过命令行选项定义宏 Makefile的条件语句 在make命令行中覆盖Makefile中的变量值 第13章习题解答 复习如何构造栈段描述符 我们接着上篇博文说. 在我修改后的文件中,用到了条件汇编. 比如: %ifdef DEBUG put_core_salt: ;打印内核的符号 ... ... put_usr_salt: ;打印用户的符号 ... .