首页 > 其他 > 详细

RabbitMQ的主题(Topic)模式(五)

时间:2020-06-03 16:16:43      阅读:44      评论:0      收藏:0      [点我收藏+]

一、定义

我们先来看一张图:
技术分享图片
这张图有几个不同的routingkey,每个routingkey都是由两段组成的;
下面我们来编写代码来实现相关功能;

二、生产者生产消息

生产者发送四条消息,routingkey不相同,代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("msg send start!");
            TopicPublisher();
            Console.WriteLine("msg send end!");
        }
        static string EXCHANGE_NAME = "routing_exchange_topic";
        static void TopicPublisher()
        {
            var conn = RabbitMQHelper.GetConnection();
            var channel = conn.CreateModel();
            channel.ExchangeDeclare(exchange: EXCHANGE_NAME, type: ExchangeType.Topic);
            var routingKeyList = new List<string>() { "usa.news", "usa.weather", "europe.news", "europe.weather" };
            for (var i = 0; i < routingKeyList.Count; i++)
            {
                var msg = $"hello topic {routingKeyList[i]}!";

                channel.BasicPublish(
                    exchange: EXCHANGE_NAME,
                    routingKey: routingKeyList[i],
                    basicProperties: null,
                    body: Encoding.UTF8.GetBytes(msg));
                Console.WriteLine($"消息发送:" + msg);
            }
            Console.WriteLine($"消息发送完成!");
            channel.Close();
            conn.Close();
        }

    }

结果运行如图:
技术分享图片

三、消费者

3.1 消费者1,绑定的routingkey为europe.#,代码如下:

        static string EXCHANGE_NAME = "routing_exchange_topic";
        static string QUEUE_NAME = "routing_queue_topic1";
        static void TopicConsumer1()
        {
            var conn = RabbitMQHelper.GetConnection();
            var channel = conn.CreateModel();
            channel.ExchangeDeclare(exchange: EXCHANGE_NAME, type: ExchangeType.Topic);
            channel.QueueDeclare(queue: QUEUE_NAME);
            // 绑定routingKey
            string routingKey = "europe.#";
            channel.QueueBind(queue: QUEUE_NAME, exchange: EXCHANGE_NAME, routingKey: routingKey);
            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) =>
            {
                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body.ToArray());
                Console.WriteLine($"Topic Consumer1 收到消息: {message},时间:{DateTime.Now}");
            };
            channel.BasicConsume(queue: QUEUE_NAME, autoAck: true, consumer: consumer);
            Console.ReadKey();
            channel.Close();
            conn.Close();
        }
    }

3.2 消费者2,绑定的routingkey为#.weather,代码如下:

        static string EXCHANGE_NAME = "routing_exchange_topic";
        static string QUEUE_NAME = "routing_queue_topic2";
        static void TopicConsumer2()
        {
            var conn = RabbitMQHelper.GetConnection();
            var channel = conn.CreateModel();
            channel.ExchangeDeclare(exchange: EXCHANGE_NAME, type: ExchangeType.Topic);
            channel.QueueDeclare(queue: QUEUE_NAME);
            string routingKey = "#.weather";
            // 可以绑定多个routingKey         
            channel.QueueBind(queue: QUEUE_NAME, exchange: EXCHANGE_NAME, routingKey: routingKey);
            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (model, ea) =>
            {
                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body.ToArray());
                Console.WriteLine($"Topic Consumer2 收到消息: {message},时间:{DateTime.Now}");
            };
            channel.BasicConsume(queue: QUEUE_NAME, autoAck: true, consumer: consumer);
            Console.ReadKey();
            channel.Close();
            conn.Close();
        }

3.3 查看运行结果

(1)队列绑定到交换机的结果如图:
技术分享图片

(2)消费者1的接收到的消息:
技术分享图片

(3)消费者2的接收到的消息:
技术分享图片
通过结果我们可以看到,消费者1和消费者2分别接收到了不同key的消息;

四、小结

1、topic模式,我们可以通过模糊匹配的,来接收自己想要的消息;使用Topic模式生产者在声明队列时需要制定消息到达队列方式为topic;
2、Consumer消费者,匹配消息时:#匹配一个或者多个关键字,*匹配一个关键字
3、参考文档:https://www.rabbitmq.com/tutorials/tutorial-five-dotnet.html

RabbitMQ的主题(Topic)模式(五)

原文:https://www.cnblogs.com/zqllove/p/12858700.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!