服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#用RabbitMQ实现消息订阅与发布

C#用RabbitMQ实现消息订阅与发布

2022-11-17 14:01Alan.hsiang C#

在消息队列模型中,如何将消息广播到所有的消费者,这种模式成为“发布/订阅”。本文主要以一个简单的小例子,简述通过fanout交换机,实现消息的发布与订阅,仅供学习分享使用,如有不足之处,还请指正。

Fanout交换机模型

扇形交换机,采用广播模式,根据绑定的交换机,路由到与之对应的所有队列。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。

C#用RabbitMQ实现消息订阅与发布

 

RabbitMQ控制台操作

新增两个队列

在同一个Virtual host下新增两个队列Q1,Q2,如下图所示:

C#用RabbitMQ实现消息订阅与发布

绑定fanout交换机

将两个队列绑定到系统默认的fanout交换机,如下所示:

C#用RabbitMQ实现消息订阅与发布

 

示例效果图

生产者,采用Fanout类型交换机发布消息,如下图所示:

C#用RabbitMQ实现消息订阅与发布

当生产者发布 一条消息时,Q1,Q2两个队列均会收到,如下图所示:

C#用RabbitMQ实现消息订阅与发布

当启动消费者后,两个消费者,均会订阅到相关消息,如下图所示:

C#用RabbitMQ实现消息订阅与发布

 

核心代码

消息发布

建立连接后,将通道声明类型为Fanout的交换机,如下所示:

/// <summary>
  /// fanout类型交换机,发送消息
  /// </summary>
  public class RabbitMqFanoutSendHelper : RabbitMqHelper {
      /// <summary>
      /// 发送消息
      /// </summary>
      /// <param name="msg"></param>
      /// <returns></returns>
      public bool SendMsg(string msg)
      {
          try
          {
              using (var conn = GetConnection("/Alan.hsiang"))
              {
                  using (var channel = conn.CreateModel())
                  {
                      channel.ExchangeDeclare(exchange: "amq.fanout", type: ExchangeType.Fanout,durable:true);

                      var body = Encoding.UTF8.GetBytes(msg);

                      channel.BasicPublish(exchange: "amq.fanout",
                                           routingKey: "",
                                           basicProperties: null,
                                           body: body);

                      //Console.WriteLine(" [x] Sent {0}", message);
                  };
              };
              return true;
          }
          catch (Exception ex)
          {
              throw ex;
          }
      }
  }

消息订阅

建立连接后,通道声明类型为Fanout的交换机,并绑定队列进行订阅,如下所示:

/// <summary>
  /// 扇形交换机接收消息
  /// </summary>
  public class RabbitMqFanoutReceiveHelper : RabbitMqHelper
  {
      public RabbitMqReceiveEventHandler OnReceiveEvent;

      private IConnection conn;

      private IModel channel;

      private EventingBasicConsumer consumer;

      public bool StartReceiveMsg(string queueName)
      {
          try
          {
              conn = GetConnection("/Alan.hsiang");

              channel = conn.CreateModel();
              channel.ExchangeDeclare(exchange: "amq.fanout", type: ExchangeType.Fanout,durable:true);
              //此处随机取出交换机下的队列
              //var queueName = channel.QueueDeclare().QueueName;
              channel.QueueBind(queue: queueName, exchange: "amq.fanout", routingKey: "");
              consumer = new EventingBasicConsumer(channel);
              consumer.Received += (model, ea) =>
              {
                  var body = ea.Body.ToArray();
                  var message = Encoding.UTF8.GetString(body);
                  //Console.WriteLine(" [x] Received {0}", message);
                  if (OnReceiveEvent != null)
                  {
                      OnReceiveEvent(queueName+"::"+message);
                  }
              };
              channel.BasicConsume(queue: queueName,
                                      autoAck: true,
                                      consumer: consumer);
              return true;
          }
          catch (Exception ex)
          {
              throw ex;
          }
      }
  }

作者:Alan.hsiang
出处:http://www.cnblogs.com/hsiang/

以上就是C#用RabbitMQ实现消息订阅与发布的详细内容,更多关于C#用RabbitMQ实现消息订阅与发布的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/hsiang/p/14771629.html

延伸 · 阅读

精彩推荐
  • C#C#接口在派生类和外部类中的调用方法示例

    C#接口在派生类和外部类中的调用方法示例

    这篇文章主要介绍了C#接口在派生类和外部类中的调用方法,结合实例形式分析了C#接口的定义与具体使用方法,需要的朋友可以参考下...

    Mr-Robot10632021-12-24
  • C#C#中委托(Delegates)的使用方法详解

    C#中委托(Delegates)的使用方法详解

    这篇文章主要为大家详细介绍了C#中委托(Delegates)的使用方法,感兴趣的朋友可以参考一下...

    C#教程网8662021-11-25
  • C#C#6.0中10大新特性的应用和总结

    C#6.0中10大新特性的应用和总结

    微软发布C#6.0、VS2015等系列产品也有一段时间了,但是网上的教程却不多,这里真对C#6.0给大家做了一些示例,分享给大家。...

    浮云也是种寂寞4652021-11-16
  • C#C#及WPF获取本机所有字体和颜色的方法

    C#及WPF获取本机所有字体和颜色的方法

    这篇文章主要介绍了C#及WPF获取本机所有字体和颜色的方法,实例分析了C#及WPF获取本机字体及颜色的相关技巧,非常简单实用,需要的朋友可以参考下...

    C#教程网5922021-10-27
  • C#如何在C#中使用OpenCV(GOCW使用教程)

    如何在C#中使用OpenCV(GOCW使用教程)

    这篇文章主要介绍了如何在C#中使用OpenCV(GOCW使用教程),帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    jsxyhelu10002022-10-25
  • C#C#请求http向网页发送接收数据的方法

    C#请求http向网页发送接收数据的方法

    这篇文章主要为大家详细介绍了C#请求http向网页发送数据、网页接收的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Joker373732022-01-19
  • C#C#如何操作Excel数据透视表

    C#如何操作Excel数据透视表

    这篇文章主要为大家详细介绍了C#如何操作Excel数据透视表, 创建透视表、设置行折叠、展开等操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    E-iceblue11632022-02-22
  • C#C# SESSION丢失问题的解决办法

    C# SESSION丢失问题的解决办法

    这篇文章主要为大家详细介绍了C# SESSION丢失问题的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    淡泊明志_宁静致远9212021-12-30