乐趣区

关于c#:如何在-C-中使用-RabbitMQ

译文链接:https://www.infoworld.com/art…

RabbitMQ 是一个十分风行的,开源的,应用 Erlang 语言编写的框架,通常在 电信级平台 中作为消息中间件应用,RabbitMQ 实现了高级的 AMQP 协定用于实现过程间,应用程序间,服务器之间的音讯交互,而且它还有一个十分???????? 的个性,你能够应用自定义插件来扩大 RabbitMQ 的性能,而且它还反对多协定,高性能,高牢靠,集群以及高可用队列。

创立队列的形式也多种多样,你能够编码创立,也能够通过管理员用户界面,甚至通过 PowerShell 进行队列创立。

RabbitMQ 术语

当你在用 RabbitMQ 时,你要了解上面两个术语

  • 队列是一个数据结构上的概念,反对 FIFO 个性,在本文中,音讯队列就是一个能够寄存音讯的微小缓存。
  • producer(生产者) 的使命是生成数据并推送到队列的一种角色组件,consumer(消费者)它可能从存储音讯的队列中提取数据进行生产,生产者 - 消费者 是并行编程中十分风行的设计模式之一。

装置和启动

装置 RabbitMQ 是非常简单的,在装置之前,你须要先装置 Erlang,依据你的操作系统抉择正确版本呢的 Erlang,下载地址:https://www.erlang.org/downloads,而后持续下载安装 RabbitMQ Server,下载地址:https://www.rabbitmq.com/down…

用 C# 构建 RabbitMQ

当初 Erlang 和 RabbitMQ 曾经胜利装置到你的 windows 上,如果想和 Rabbitmq Server 进行交互,你须要装置一个 RabbitMQ .NET client,能够用 NuGet Package Manager 控制台去装置 RabbitMQ Client。

在 Visual Studio 中新建一个 Console Application,而后通过 NuGet Package Manager 装置 RabbitMQ.Client 开发包,假设 RabbitMQ Server 是运行在本机,上面的代码片段创立了一个和 RabbitMQ Server 交互的 Connection 连贯,代码如下:


ConnectionFactory connectionFactory = new ConnectionFactory();
IConnection connection = connectionFactory.CreateConnection();

当初再次假设 RabbitMQ 跑在近程服务器上,上面的办法返回了一个通往 Rabbitmq Service 的 Connection 连贯。


public IConnection GetConnection(string hostName, string userName, string password)
        {ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.HostName = hostName;
            connectionFactory.UserName = userName;
            connectionFactory.Password = password;
            return connectionFactory.CreateConnection();}

发送和接管音讯

当初 RabbitMQ Service 曾经在本地失常运行,应用上面的办法向队列发送音讯,请留神通往 RabbitMQ Service 的 Connection 用的是默认配置。


public static void Send(string queue, string data)
        {using (IConnection connection = new ConnectionFactory().CreateConnection())
            {using (IModel channel = connection.CreateModel())
                {channel.QueueDeclare(queue, false, false, false, null);
                    channel.BasicPublish(string.Empty, queue, null, Encoding.UTF8.GetBytes(data));
                }
            }
        }

channel 罕用于和 server 进行通信从而发送和接管音讯,不过下面这种队列是不长久的,为啥这么说呢?因为我在 QueueDeclare 办法的第二个参数中设置了 false,所以送往这个 queue 的 message 只会存留于内存中,一旦 server 重启,这个数据将会失落。

上面的代码展现了如何从 queue 中生产数据。


        public static void Receive(string queue)
        {using (IConnection connection = new ConnectionFactory().CreateConnection())
            {using (IModel channel = connection.CreateModel())
                {channel.QueueDeclare(queue, false, false, false, null);
               var consumer = new EventingBasicConsumer(channel);
               BasicGetResult result = channel.BasicGet(queue, true);
                    if (result != null)
                    {
                      string data =
                      Encoding.UTF8.GetString(result.Body);
                        Console.WriteLine(data);
                    }
                }
            }
        }

接下来的代码片段展现了如何应用 Send 和 Receive 办法进行数据的发送和生产。


static void Main(string[] args)
{Send("IDG","Hello World!");
     Receive("IDG");
     Console.ReadLine();}

值得一提的是:RabbitMQ 对长久化也提供了十分好的反对,有两种模式的 queue 可供选择:长久化和非长久化,如果采纳长久化模式,音讯是寄存在硬盘中的,反之非长久化的模式,数据仅仅寄存于内存中,一旦 server 重启,非长久化模式的队列数据将会失落,最初补充一下,长久化能够用于以下三个级别上:Queue,Exchange 和 Message。

更多高质量干货:参见我的 GitHub: dotnetfly

退出移动版