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

 更新时间:2021年05月17日 08:46:22   作者:Alan.hsiang  
RabbitMQ做为消息代理,负责接收和转发消息,可以将RabbitMQ比喻为一个邮筒、一个邮局和一个邮递员。本文主要以一个简单的小例子,简述RabbitMQ实现消息传输的相关内容,仅供学习分享使用,如有不足之处,还请指正。

消息队列模型

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

RabbitMQ设置

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

RabbitMQ动态库安装

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

RabbitMQ.Client相关知识点

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

示例效果图

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

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

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

核心代码

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

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实现点对点消息传输的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈C#中Md5和Sha1两种加密方式

    浅谈C#中Md5和Sha1两种加密方式

    这篇文章主要介绍了浅谈C#中Md5和Sha1两种加密方式的相关资料,需要的朋友可以参考下
    2015-07-07
  • C# wpf实现任意控件更多调整大小功能

    C# wpf实现任意控件更多调整大小功能

    这篇文章主要为大家详细介绍了C# wpf实现任意控件更多调整大小功能的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C# 根据表格偶数、奇数加载不同颜色

    C# 根据表格偶数、奇数加载不同颜色

    这篇文章主要介绍了C# 根据表格偶数、奇数加载不同颜色,需要的朋友可以参考下
    2017-09-09
  • C#多线程基本使用小结

    C#多线程基本使用小结

    C#多线程编程涉及Thread、Task、异步和Parallel等工具,Thread类用于创建独立线程,通过Priority属性设置优先级,而线程池管理线程的调度和重用,本文给大家介绍C#多线程基本使用小结,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • 基于C#实现高效示波器功能

    基于C#实现高效示波器功能

    这篇文章介绍了用 C#实现示波器功能的方法,包括使用 WinForm 及多种曲线控件,阐述了原理和思路,如定义缓存数据的队列、转化数组刷新显示等,还提到注意事项及扩展特性,最后呼吁点赞支持和交流,需要的朋友可以参考下
    2024-12-12
  • DataGridView带图标的单元格实现代码

    DataGridView带图标的单元格实现代码

    这篇文章主要为大家详细介绍了DataGridView带图标的单元格的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • C#自定义IP输入框控件

    C#自定义IP输入框控件

    这篇文章主要为大家详细介绍了C#自定义IP输入框控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C#条码生成及打印实例代码

    C#条码生成及打印实例代码

    这篇文章主要为大家详细介绍了C#条码生成及打印实例代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • C#如何通过probing指定dll寻找文件夹详解

    C#如何通过probing指定dll寻找文件夹详解

    这篇文章主要给大家介绍了关于C#如何通过probing指定dll寻找文件夹的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • C#心跳机制服务器的示例代码

    C#心跳机制服务器的示例代码

    心跳机制出现在tcp长连接中,客户端和服务器之见定时发送一种特殊的数据包,本文主要介绍了C#心跳机制服务器的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06

最新评论