代码改变世界

RabbitMQ八:交换机类型Exchange Types--Topic介绍

2017-08-15 16:35  小白admin  阅读(1749)  评论(0编辑  收藏  举报

前言

上一章节,我们说了两个类型,本章我们说一下其三:Topic Exchange

Topic Exchange 

Topic Exchange – 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。我在RedHat的朋友做了一张不错的图,来表明topic交换机是如何工作的: 

情景进入

 Topic解决了我们另一个需求。举个例子,有一个做资讯的公司,他们会收集各种科技公司的动态并且第一时间转发出来。小编A负责小米公司,小编B负责华为公司,手工去搜索文章并且看标题是否匹配再进行转发是非常的低效的,可能小编们想要偷懒,写一个程序去各大网站进行爬数据,对于标题中含有小米的交给小编A,对于标题中含有华为的交给小编B。

代码块

 发布者:

         /// <summary>
        /// Topic实现   模拟场景: 对于标题中含有小米的交给小编A,对于标题中含有华为的交给小编B。 
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            var flag = true;
            while (flag)
            {
                Console.WriteLine("请输入要发布的消息key|msg");
                var msg = Console.ReadLine();
                if (msg != null && msg != "")
                    using (var channel = HelpConnection.GetConnection().CreateModel())
                    {
                        channel.ExchangeDeclare("TopicExchange", ExchangeType.Topic, true, false, null);
                        var msgs = msg.Split('|');
                        var body = Encoding.UTF8.GetBytes(msgs[1]);

                        Console.WriteLine("发布内容:键" + msgs[0]);
                        Console.WriteLine("发布内容:值" + msgs[1]);
                        channel.BasicPublish("TopicExchange", msgs[0], null, body);
                        Console.WriteLine("发布成功");
                    }
                else {
                    flag = true;
                }
            }
            Console.ReadKey();
        }

消费端

  /// <summary>
        /// Topic实现   模拟场景: 对于标题中含有小米的交给小编A,对于标题中含有华为的交给小编B。 
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            bool flag = true;
            var key = "";
            while (flag)
            {
                Console.WriteLine("请输入路由正则, .代表字符,*代表零到多个字符");
                key = Console.ReadLine();
                if (string.IsNullOrWhiteSpace(key))
                {
                    Console.Write("请输入路由");
                    flag = true;
                }
                else
                {
                  //  flag = false;
                    using (var channel = HelpConnection.GetConnection().CreateModel())
                    {
                        var queueName = key + "Queue";

                        channel.ExchangeDeclare("TopicExchange", ExchangeType.Topic, true, false, null);

                        channel.QueueDeclare(queueName, true, false, false, null);

                        channel.QueueBind(queueName, "TopicExchange", key, null);

                        var consumer = new EventingBasicConsumer(channel);

                        consumer.Received += (mode, e) =>
                        {
                            var body = Encoding.UTF8.GetString(e.Body);

                            Console.WriteLine("显示内容:" + body);
                        };
                        channel.BasicConsume(queueName, true, consumer);
                        Console.ReadKey();
                    }
                }
            }
        }

效果图

 

  • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
  • 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。