温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-05-17 11:23:56 来源:亿速云 阅读:493 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关C#如何用RabbitMQ实现消息订阅与发布的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

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;
            }
        }
    }

C#是什么

C#是一个简单、通用、面向对象的编程语言,它由微软Microsoft开发,继承了C和C++强大功能,并且去掉了一些它们的复杂特性,C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程从而成为.NET开发的首选语言,但它不适用于编写时间急迫或性能非常高的代码,因为C#缺乏性能极高的应用程序所需要的关键功能。

感谢各位的阅读!关于“C#如何用RabbitMQ实现消息订阅与发布”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI