zoukankan      html  css  js  c++  java
  • RabbitMQ Topic exchange

    RabbitMQ Topic exchange

     

    Topic exchange

    topic与之前的每个类型都不同(ps:废话每个都是不同的)。Topic解决了我们另一个需求。举个例子,有一个做资讯的公司,他们会收集各种科技公司的动态并且第一时间转发出来。小编A负责微软公司,小编B负责谷歌公司,手工去搜索文章并且看标题是否匹配再进行转发是非常的低效的,可能小编们想要偷懒,写一个程序去各大网站进行爬数据,对于标题中含有微软的交给小编A,对于标题中含有谷歌的交给小编B。

    是的,topic就是类似与正则进行模糊匹配routingkey,对于key需求是即确定又不完全确定的。

    *代表零到多个字符

    . 代表一个字符

    把这个嵌套到代码中,先看生产者部分代码,现在发布不再是写死的,可以在控制台程序中输入的。

    复制代码
                var flag = true;
                while (flag)
                {
    
                    Console.WriteLine("请输入要发布的消息 key|msg。 或者按Ctrl+ C退出");
    
                    var msg = Console.ReadLine();
    
                    //创建返回一个新的频道
                    using (var channel = RabbitMqHelper.GetConnection().CreateModel())
                    {
    
                        var msgs = msg.Split('|');
    
                        //发布一个消息
                        var body = Encoding.UTF8.GetBytes(msgs[1]);
    
                        channel.BasicPublish("TopicExchange", routingKey: msgs[0], basicProperties: null, body: body);
    
                        Console.Write("发布成功!");
    
                    }
                }
    复制代码

    再把注意力转到consumer端,可以指定路由规则。声明了一个topic类型的exchange进行绑定。然后进行消费

    复制代码
                bool flag = true;
                var key = "";
                while (flag)
                {
                    Console.WriteLine("请输入路由正则  .代表一个字符 *代表零到多个字符");
                    key = Console.ReadLine();
                    if (string.IsNullOrWhiteSpace(key))
                    {
                        Console.Write("请输入路由");
                        continue;
                    }
                    else
                        flag = false;
    
                }
    
                using (var channel = RabbitMqHelper.GetConnection().CreateModel())
                {
                    //根据声明使用的队列
                    var QueueName = key + "Queue";
    
                    //声明交换机 headers模式
                    channel.ExchangeDeclare("TopicExchange", ExchangeType.Topic, true, false);
    
                    channel.QueueDeclare(QueueName, true, false, false, null);
                    //进行绑定
                    channel.QueueBind(QueueName, "TopicExchange", key, null);
    
                    //创建consumbers
                    var consumer = new EventingBasicConsumer(channel);
    
                    consumer.Received += (sender, e) =>
                    {
                        var msg = Encoding.UTF8.GetString(e.Body);
    
                        Console.WriteLine($"{e.RoutingKey}:{msg}");
                    };
    
                    //进行消费
                    channel.BasicConsume(QueueName, true, consumer);
    
                    Console.ReadKey();
    
                }
    复制代码

    现在,让我们把程序跑起来,并指定了 *微软*与*谷歌*的路由

    image

    再发布几条匹配的消息

    image

  • 相关阅读:
    开发工具 之 PowerDesigner 应用积累
    PowerDesigner 之 PDM建模
    开发工具 之 PowerDesigner
    LCD 和 LED 的区别?
    图像色彩空间YUV和RGB的差别
    ubuntu使用中的一些问题
    FFMPEG-数据结构解释(AVCodecContext,AVStream,AVFormatContext)
    Winform的多线程问题
    C#子线程更新UI控件的方法总结
    malloc(0)的问题
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7567379.html
Copyright © 2011-2022 走看看