zoukankan      html  css  js  c++  java
  • RabbitMQ Exchange中的fanout类型

    RabbitMQ Exchange中的fanout类型

     

    fanout 多播

    在之前都是使用direct直连类型的交换机,通过routingkey来决定把消息推到哪个queue中。

    而fanout则是把拿到消息推到与之绑定的所有queue中。

    分析业务,怎样的场景需要它呢?某个用户注册了网站的用户,一般我们需要发送短信和邮件通知,莫非要在同一个consumer中把这两件事都做了?这不符合单一职责,可是发送的消息是一样的,只是方式不一样。要使用两种routingkey都发送一次?这显然也不是我们想要的。所以fanout出现了

    fanout类型的exchange会把消息推到所有的queue中,所以不需要指定routingkey,指定了也没用!

    下面通过代码来看

    这里有两种需求,发短信与发邮件

    复制代码
    //创建返回一个新的频道
     using (var channel = RabbitMqHelper.GetConnection().CreateModel())
    {
    
           //发布一个消息
            var msg = Encoding.UTF8.GetBytes($"二狗子");
            //不需要指定routingkey,指定了也没用.因为交换机是fanout类型
            channel.BasicPublish("fanoutExchange", routingKey: string.Empty, basicProperties: null, body: msg);
    
            Console.Write("发布成功!");
    
    }
    
           Console.ReadKey();
    复制代码

    这里是consumer部分的代码

    复制代码
                bool flag = true;
                string pattern = "";
                while (flag)
                {
                    Console.WriteLine("请选择Ccnsumer模式  1(发短信)/2(发邮件)");
                    pattern = Console.ReadLine();
                    if (pattern == "1" || pattern == "2")
                        flag = false;
                    else
                        Console.Write("请做出正确的选择");
                }
    
    
    
                using (var channel = RabbitMqHelper.GetConnection().CreateModel())
                {
    
                    //声明交换机 Fanout模式
                    channel.ExchangeDeclare("fanoutExchange", ExchangeType.Fanout, true, false, null);
                    //根据声明使用的队列
                    var queueName = pattern == "1" ? "sms" : "emai";
                    channel.QueueDeclare(queueName, true, false, false, null);
                    //进行绑定
                    channel.QueueBind(queueName, "fanoutExchange", string.Empty, null);
    
                    //创建consumbers
                    var consumer = new EventingBasicConsumer(channel);
    
                    consumer.Received += (sender, e) =>
                    {
                        var msg = Encoding.UTF8.GetString(e.Body);
    
                        var action = (pattern == "1" ? "发短信" : "发邮件");
                        Console.WriteLine($"给{msg}{action}");
                    };
    
                    //进行消费
                    channel.BasicConsume(queueName, true, consumer);
    
                    Console.ReadKey();
    
                }
    复制代码

    下面把程序运行起来,不同的consumer进行了不同的消费

    image

  • 相关阅读:
    FileZilla Server下载及安装
    FileZilla Server设置虚拟目录
    FileZilla Server超详细配置
    Freaktab将于12月底关闭
    Thinkpad笔记本指点杆(小红点)自动漂移的问题
    STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)
    STC12C5A56S2和DS12C887做的电子闹铃
    联盛德 HLKW806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD
    联盛德 HLKW806 (六): I2C驱动SSD1306 128x64 OLED液晶屏
    联盛德 HLKW806 (五): W801开发板上手报告
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7567365.html
Copyright © 2011-2022 走看看