zoukankan      html  css  js  c++  java
  • RabbitMQ headers Exchange

    Headers Exchange

    headers也是一种交换机类型,但是在rabbitmq官网中的教程中并没有说到。资料也很少,但是找一找总会有的。

    headers与direct的模式不同,不是使用routingkey去做绑定。而是通过消息headers的键值对匹配

    发布者  -- >  headersexchange  -->  (user:  “小明 ”) binding  --> queue

    也就是说 user: 小明 替代了之前的routingkey。在做绑定的时候有两种匹配方式供选择。x-match (all/any)

    意思就是键值对中所有的项都要匹配与只要有一个匹配就可以。下面就可以动手写代码了

    在生产消息的时候,我们往消息的headers中附加了user:admin,pwd:123456

              //创建返回一个新的频道
                using (var channel = RabbitMqHelper.GetConnection().CreateModel())
                {
    
                    //创建properties
                    var properties = channel.CreateBasicProperties();
    
                    //往内容的headers中塞入值 
                    properties.Headers = new Dictionary<string, object>()
                    {
                        {"user","admin" },
                        {"pwd","123456" }
                    };
    
    
                    //发布一个消息
                    var msg = Encoding.UTF8.GetBytes($"二狗子");
    
                    channel.BasicPublish("headersExchange", routingKey: string.Empty, basicProperties: properties,body: msg);
    
                    Console.Write("发布成功!");
    
                }
    
                Console.ReadKey();

    在consumer中,我们可以选择创建两种方式,any/all。绑定的时候我们放了一些匹配项在里面,也就是如果 user:admin、pwd:123456 headers类型的exchange就可以把消息推到queue中

                bool flag = true;
                string pattern = "";
                while (flag)
                {
                    Console.WriteLine("请选择headers匹配模式  1(any)/2(all)");
                    pattern = Console.ReadLine();
                    if (pattern == "1" || pattern == "2")
                        flag = false;
                    else
                        Console.Write("请做出正确的选择");
                }
    
    
    
                using (var channel = RabbitMqHelper.GetConnection().CreateModel())
                {
                    //根据声明使用的队列
                    var headersType = pattern == "1" ? "any" : "all";
    
                    //声明交换机 headers模式
                    channel.ExchangeDeclare("headersExchange", ExchangeType.Headers, true, false);
    
                    channel.QueueDeclare("headersQueue", true, false, false, null);
                    //进行绑定
                    channel.QueueBind("headersQueue", "headersExchange", string.Empty, new Dictionary<string, object>
                    {
                        //第一个匹配格式 ,第二与第三个则是匹配项
                        { "x-match",headersType},
                        { "user","admin"},
                        { "pwd","123456"}
                    });
    
                    //创建consumbers
                    var consumer = new EventingBasicConsumer(channel);
    
                    consumer.Received += (sender, e) =>
                    {
                        var msg = Encoding.UTF8.GetString(e.Body);
    
                        Console.WriteLine($"{msg}");
                    };
    
                    //进行消费
                    channel.BasicConsume("headersQueue", true, consumer);
    
                    Console.ReadKey();
    
                }

    这里实验一个all类型的,首先把consumer运行起来,第一次我们的生产者的headers中只一个项匹配,可以看到消息是发布出去了,但是consumer并没有从queue中收到,也就是这边是不匹配的 exchange并没有把消息推到queue。

    image

    在webui中也是可以看到queue中是没有任何消息的

    image

    这时再把生产者的headers中user也加上,现在是完全匹配的再发布一次消息,发布的消息被consumer消费掉了

    image

  • 相关阅读:
    罗尔定理、微分中值定理、广义微分中值定理
    高等数学和数学分析教材推荐及其学习方法浅谈
    音视频下载插件 安装及使用
    win10台式机rtl8188eu(FW 150 UM V2.0)无线网卡无法连接wifi(无法连接到这个网络)
    django模板中的extends和include使用方法
    wordpress中文目录出现“有点尴尬诶!该页无法显示"
    wordpress迁移后登陆时出现Forbidden You don’t have permission to access /wp-login.php on this server
    centos设置开机自启动脚本
    hexo的jacman主题设置语言为英文后偶尔出现中文
    安卓QQ聊天记录导出、备份完全攻略
  • 原文地址:https://www.cnblogs.com/LiangSW/p/6201940.html
Copyright © 2011-2022 走看看