zoukankan      html  css  js  c++  java
  • RabbitMQ初探--用C#简单实现通信服务

    MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

    消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用(例如上篇文章说到的Thrift)的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

    来,我们开始进入初探的大门。

    第一步:

    当然是下载相关东西。

    因为RabbitMQ是由erlang实现的,所以需要先安装erlang。

    下载erlang并安装,目前最新版本是21.0.1。

    再下载RabbitMQ-server并安装,目前最新版本是3.7.7。

    第二步:

    用VisualStudio创建两个如下程序集(控制台程序),ConsumerClient(消费端)、ProducerClient(生产端)。

    第三步:

    两个程序集都用NuGet添加EasyNetQ引用,EasyNetQ是RabbitMQ官方封装好的一个组件,利用它可以更方便的使用RabbitMQ。当然EasyNetQ会依赖于RabbitMQ.Client,所以你添加EasyNetQ引用的同时,也会添加RabbitMQ.Client。

    第四步:

    编写具体代码:

    ConsumerClient端中Program.cs部分代码为:

            /// <summary>
            /// 主函数
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                IBus bus = RabbitHutch.CreateBus(string.Format("host={0}", "127.0.0.1:5672"));
                IAdvancedBus advancedBus = bus.Advanced;
                IExchange exChange = advancedBus.ExchangeDeclare("fanout_mq", "fanout");
                IQueue queue = advancedBus.QueueDeclare();
                advancedBus.Bind(exChange, queue, string.Empty);
    
                advancedBus.Consume(queue, registration => { registration.Add<string>((message, info) => { Console.WriteLine("接收到消息【{0}】", message.Body); }); });
                Console.ReadLine();
            }

    ProducerClient端中Program.cs部分代码为:

            /// <summary>
            /// 主函数
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                try
                {
                    IBus bus = RabbitHutch.CreateBus(string.Format("host={0}", "127.0.0.1:5672"));
                    IAdvancedBus advancedBus = bus.Advanced;
                    IExchange exChange = advancedBus.ExchangeDeclare("fanout_mq", "fanout");
    
                    new Action(() =>
                    {
                        for (int i = 0; i < 1000; i++)
                        {
                            Thread.Sleep(1000);
                            string message = "$$$$$$一号比较长的消息类型$$$$$$" + i;
                            advancedBus.Publish(exChange, string.Empty, false, new Message<string>(message));
                            Console.WriteLine("已发送消息【{0}】", message);
                        }
                    }).BeginInvoke(null, null);
    
                    IExchange exChange2 = advancedBus.ExchangeDeclare("fanout_mq", "fanout");
                    new Action(() =>
                    {
                        for (int i = 0; i < 2000; i++)
                        {
                            Thread.Sleep(500);
                            string message = "######二号短消息类型" + i;
                            advancedBus.Publish(exChange2, string.Empty, false, new Message<string>(message));
                            Console.WriteLine("已发送消息【{0}】", message);
                        }
                    }).BeginInvoke(null, null);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                Console.ReadLine();
            }

    第五步:

    执行程序,先执行ConsumerClient,再执行ProducerClient,测试一下,两个进程就通过这个消息队列达到通信的目的了,大功告成!

  • 相关阅读:
    error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
    E: 无法获得锁 /var/lib/apt/lists/lock
    卸载nginx
    服务器文件传输
    一些重要的sql命令
    设置某个字段的值是唯一的
    mysql注释的方法
    认证 (authentication) 和授权 (authorization) 的区别
    neutron_lib: 一个进程内的发布与订阅
    人工智能导论作业
  • 原文地址:https://www.cnblogs.com/yuwuji/p/9305900.html
Copyright © 2011-2022 走看看