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

 更新时间:2021年05月17日 09:04:55   作者:Alan.hsiang  
在消息队列模型中,如何将消息广播到所有的消费者,这种模式成为“发布/订阅”。本文主要以一个简单的小例子,简述通过fanout交换机,实现消息的发布与订阅,仅供学习分享使用,如有不足之处,还请指正。

Fanout交换机模型

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

RabbitMQ控制台操作

新增两个队列

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

绑定fanout交换机

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

示例效果图

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

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

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

核心代码

消息发布

建立连接后,将通道声明类型为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实现消息订阅与发布的资料请关注脚本之家其它相关文章!

相关文章

  • Unity绘制二维动态曲线

    Unity绘制二维动态曲线

    这篇文章主要为大家详细介绍了Unity绘制二维动态曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C# 获取汉字的拼音首字母

    C# 获取汉字的拼音首字母

    一种是把所有中文字符集合起来组成一个对照表;另一种是依照汉字在Unicode编码表中的排序来确定拼音的首字母。碰到多音字时就以常用的为准(第一种方法中可以自行更改,方法为手动把该汉字移动到对应的拼音首字母队列,我们这里介绍第二种
    2015-06-06
  • 基于C#实现获取Windows所有窗口句柄

    基于C#实现获取Windows所有窗口句柄

    在做录屏或截屏操作时,需要获取当前正在运行中的桌面程序句柄,所以这篇文章主要为大家详细介绍了如何使用C#实现获取Windows所有窗口句柄,需要的可以参考下
    2023-12-12
  • c#调用jar包的方法步骤(非常详细)

    c#调用jar包的方法步骤(非常详细)

    这篇文章主要给大家介绍了关于c#调用jar包的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 浅析C# 结构体struct

    浅析C# 结构体struct

    这篇文章主要介绍了C# 结构体struct 的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • C#实现货币金额数字转大写汉字

    C#实现货币金额数字转大写汉字

    这篇文章主要为大家详细介绍了如何使用C#实现货币金额数字转大写汉字功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C#实现剪切板功能

    C#实现剪切板功能

    这篇文章主要为大家详细介绍了C#实现剪切板功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • .NET使用IResourceMonitor实现获取资源信息

    .NET使用IResourceMonitor实现获取资源信息

    在 Microsoft.Extensions.Diagnostics.ResourceMonitoring 包提供了一系列定制 API,专用于监视 .NET 应用程序的资源利用率,本文将利用IResourceMonitor来实现获取资源状态信息,感兴趣的可以了解下
    2024-01-01
  • C#实现对数组进行随机排序类实例

    C#实现对数组进行随机排序类实例

    这篇文章主要介绍了C#实现对数组进行随机排序类,实例分析了C#数组与随机数操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • C#多线程与跨线程访问界面控件的方法

    C#多线程与跨线程访问界面控件的方法

    这篇文章主要介绍了C#多线程与跨线程访问界面控件的方法,实例分析了C#多线程与跨线程访问空间的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论