• RabbitMQ 在 C# 中简单应用


    RabbitMQ是什么及如何安装就不再赘述,百度一下就知道了,只是在配置方面要多加注意。

    话不多说,先直接上一个简示例代码

    发送端:

                ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" };
                using (IConnection conn = factory.CreateConnection())
                {
                    using (IModel im = conn.CreateModel())
                    {
                        im.ExchangeDeclare("rabbitmq_route", ExchangeType.Direct);
                        im.QueueDeclare("rabbitmq_query", false, false, false, null);
                        im.QueueBind("rabbitmq_query", "rabbitmq_route", ExchangeType.Direct, null);
                        for (int i = 0; i < 1000; i++)
                        {
                            byte[] message = Encoding.UTF8.GetBytes("Hello Lv");
                            im.BasicPublish("rabbitmq_route", ExchangeType.Direct, null, message);
                            Console.WriteLine("send:" + i);
                        }
                    }
                }

    接收端:

                ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" };
                using (IConnection conn = factory.CreateConnection())
                {
                    using (IModel im = conn.CreateModel())
                    {
                        while (true)
                        {
                            BasicGetResult res = im.BasicGet("rabbitmq_query", true);
                            if (res != null)
                            {
                                Console.WriteLine("receiver:"+UTF8Encoding.UTF8.GetString(res.Body));
                            }
                        }
                    }
                }

     发送端一次性发送一千条,发送过程很快,接收时相对要慢一些。

                                

                              上述DEMO只限一个接收着,那相同的发送量,多个接收者会出现什么情况,添加一个新的接收端,直接复制DEMO中接收端即可。

                             

    附上运行结果:

                            

    可以看到,在两个接收端同时运行时,RabbitMQ 会按顺序的分发每个消息。当每个收到确认后,会将该消息删除,然后将下一个分发到下一个接收者,主要是因为RabbitMQ的循环分发机制。

    上面简单说了一下,在多个接收者时,因为循环分发的原因,消息几乎是两个接收端对分的。

    那么如何将相同的消息分发到多个接收端。

     对发送端代码进行修改:

                ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" };
                using (IConnection conn = factory.CreateConnection())
                {
                    using (IModel im = conn.CreateModel())
                    {
                        im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);// 路由
                        int i = 0;
                        while (true)
                        {
                            Thread.Sleep(1000);
                            ++i;
                            byte[] message = Encoding.UTF8.GetBytes(i.ToString());
                            im.BasicPublish("rabbitmq_route_Fanout", "", null, message);
                            Console.WriteLine("send:" + i.ToString());
                        }
                    }
                }

                             

    与上种方式比较,会发现在代码注释后面少两段代码,在设置了Fanout方式后,不需要再指定队列名称。停一秒是为了方便看结果,以免刷新太快。

     再来看看接收端代码:

                ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" };
                using (IConnection conn = factory.CreateConnection())
                {
                    using (IModel im = conn.CreateModel())
                    {
                        im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);
                        var queueOk = im.QueueDeclare();//1
                        im.QueueBind(queueOk.QueueName, "rabbitmq_route_Fanout", "");//2
                        var consumer = new QueueingBasicConsumer(im);//3
                        im.BasicConsume(queueOk.QueueName, true, consumer);//4
                        while (true)
                        {var _result = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//5
                            var body = _result.Body;
                            var message = Encoding.UTF8.GetString(body);
                            Console.WriteLine("received:{0}", message);
                        }
                    }
                

    当一个新的接收端连接时(消费者),需要一个申报一个新的队列,注释1处代码,RabbitMQ在申报队列时,如果不指定名称会自动生成一个,这还是不错的。

     两个接收端时运行结果,符合预期。

                                                                    

                                            

      至于广播方式有什么不好之处,亲自运行下就知道了.

                           

  • 相关阅读:
    SonarQube Scanner的配置与使用简介
    MySQL 查看及修改数据库引擎
    react封装echarts仪表盘 吴小明
    优化(兼容):antd表格横向滚动在Safari浏览器上的bug 吴小明
    vue使用toast全局替换alert 吴小明
    实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案 吴小明
    【前端优化】前端需要注意哪些 SEO 吴小明
    不可错过,RF之WebDriver功能配置
    Node获取路径的3种方法
    正则表达式中如何解决,提取固定区间中出现特征字符最近的内容
  • 原文地址:https://www.cnblogs.com/lvlinlv/p/7235013.html
Copyright © 2020-2023  润新知