服务器之家:专注于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:00Alan.hsiang C#

RabbitMQ做为消息代理,负责接收和转发消息,可以将RabbitMQ比喻为一个邮筒、一个邮局和一个邮递员。本文主要以一个简单的小例子,简述RabbitMQ实现消息传输的相关内容,仅供学习分享使用,如有不足之处,还请指正。

消息队列模型

所有 MQ 产品从模型抽象上来说都是一样的过程:
消费者(consumer)订阅某个队列。生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。

C#利用RabbitMQ实现点对点消息传输

 

RabbitMQ设置

RabbitMQ是通过交换机将消息转发到对应队列,所以队列需要和交换机进行绑定。本例将队列绑定到默认的amq.direct交换机,并设置Routing key,如下图所示:

C#利用RabbitMQ实现点对点消息传输

 

RabbitMQ动态库安装

通过NuGet包管理器进行安装RabbitMQ.Client,如下所示:

C#利用RabbitMQ实现点对点消息传输

 

RabbitMQ.Client相关知识点

  • ConnectionFactory:构造一个实例,主要创建连接。
  • IConnection:表示一个基于AMQP协议的连接。
  • IModel:表示一个RabbitMQ通道,可用于声明一个队列,然后开始消费。
  • EventingBasicConsumer:基于独立事件监听的基础消费者,可以监听并接收消息。
  • 生产者基本步骤:1. 创建连接 2. 基于连接创建通道 3. 基于通道声明队列,4. 开始生产并发布消息
  • 消费者基本步骤:1. 创建连接 2. 基于连接创建通道 3. 基于通道声明队列,4. 创建消费者,5. 绑定通道和消费者,并开始消费

 

示例效果图

本例主要有一个生产者,一个消费者,通过消息队列进行消息转发和接收。

生产者负责消息发送,如下图所示:

C#利用RabbitMQ实现点对点消息传输

消费者负责消息接收,如下图所示:

C#利用RabbitMQ实现点对点消息传输

 

核心代码

代码结构:主要包括生产者,消费者,公共基础代码,如下所示:

C#利用RabbitMQ实现点对点消息传输

RabbitMqHelper主要创建连接,如下所示:

public class RabbitMqHelper
  {

      /// <summary>
      /// 创建连接
      /// </summary>
      /// <returns></returns>
      public IConnection GetConnection()
      {
          try
          {
              var factory = new ConnectionFactory()
              {
                  HostName = "127.0.0.1",
                  Port = 5672,
                  UserName = "guest",
                  Password = "guest",
                  VirtualHost = "/ShortMsgHost"
              };
              var conn = factory.CreateConnection();
              return conn;
          }
          catch (Exception ex) {
              throw ex;
          }
      }



  }

RabbmitMqSendHelper用于发送消息,如下所示:

public class RabbmitMqSendHelper : RabbitMqHelper
  {
      /// <summary>
      /// 发送消息
      /// </summary>
      /// <param name="msg"></param>
      /// <returns></returns>
      public bool SendMsg(string msg)
      {
          try
          {
              using (var conn = GetConnection())
              {
                  using (var channel = conn.CreateModel())
                  {
                      channel.QueueDeclare(queue: "ShortMsgQueue",
                                   durable: true,
                                   exclusive: false,
                                   autoDelete: false,
                                   arguments: null);
                      var body = Encoding.UTF8.GetBytes(msg);

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

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

RabbitMqReceiveHelper主要用于接收信息,如下所示:

public class RabbitMqReceiveHelper : RabbitMqHelper
  {
      public RabbitMqReceiveEventHandler OnReceiveEvent;

      private IConnection conn;

      private IModel channel;

      private EventingBasicConsumer consumer;

      public bool StartReceiveMsg()
      {
          try
          {
              conn = GetConnection();

              channel = conn.CreateModel();

              channel.QueueDeclare(queue: "ShortMsgQueue",
                              durable: true,
                              exclusive: false,
                              autoDelete: false,
                              arguments: null);

              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(message);
                  }
              };
              channel.BasicConsume(queue: "ShortMsgQueue",
                                      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/14770632.html

延伸 · 阅读

精彩推荐
  • C#详解C# Socket编程笔记

    详解C# Socket编程笔记

    这篇文章主要介绍了详解C# Socket编程笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。...

    stg60911342021-12-15
  • C#C#类继承中构造函数的执行序列示例详解

    C#类继承中构造函数的执行序列示例详解

    这篇文章主要给大家介绍了关于C#类继承中构造函数的执行序列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学...

    yixuan.han5292022-02-28
  • C#开源一个c# 新的雪花算法

    开源一个c# 新的雪花算法

    这篇文章主要介绍了开源一个c# 新的雪花算法的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    yitter4582022-11-07
  • C#c# 应用NPOI获取Excel中的图片,保存至本地的算法

    c# 应用NPOI获取Excel中的图片,保存至本地的算法

    本文主要介绍了c# 应用NPOI获取Excel中的图片,保存至本地的算法。具有很好的参考价值,下面跟着小编一起来看下吧...

    SweetMemory10612021-12-23
  • C#C# WebApi 接口传参详解

    C# WebApi 接口传参详解

    这篇文章主要介绍了C# WebApi 接口传参详解,本篇打算通过get、post、put、delete四种请求方式分别谈谈基础类型(包括int/string/datetime等)、实体、数组等类型...

    懒得安分9942022-02-25
  • C#C#实现从多列的DataTable里取需要的几列

    C#实现从多列的DataTable里取需要的几列

    这篇文章主要介绍了C#实现从多列的DataTable里取需要的几列,涉及C#针对DataTable操作的相关技巧,需要的朋友可以参考下...

    lyflcear8312021-11-15
  • C#SQLite之C#版 System.Data.SQLite使用方法

    SQLite之C#版 System.Data.SQLite使用方法

    这篇文章主要介绍了SQLite之C#版 System.Data.SQLite使用方法,需要的朋友可以参考下...

    孟栋10952022-10-10
  • C#C#中abstract的用法详解

    C#中abstract的用法详解

    abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的基类,不能实例化,而且abstract修饰的成员在派生...

    Q3012263910932021-12-15