zoukankan      html  css  js  c++  java
  • RabbitMQ 官方NET教程(一)【介绍】

    本教程假定RabbitMQ已在标准端口(5672)上的localhost上安装并运行。如果使用不同的主机,端口或凭据,连接设置将需要调整。

    RabbitMQ是一个消息代理:它接受并转发消息。 您可以将其视为邮局:当您将要发布的邮件放在邮箱中时,您可以确信Postman先生最终会将邮件发送给收件人。 在这个比喻中,RabbitMQ是一个邮箱,邮局和邮递员。

    RabbitMQ和邮局之间的主要区别在于它不处理纸张,而是接受,存储和转发二进制数据块的消息。

    RabbitMQ和消息传递一般使用一些术语。

     生产意味着什么不仅仅是发送。发送消息的程序是一个`producer`:
    

    队列是居住在RabbitMQ中的邮箱的名称。 虽然消息流过RabbitMQ和您的应用程序,但它们只能存储在队列中。 队列只受主机的内存和硬盘限制的限制,它本质上是一个大的消息缓冲区。 许多生产者可以发送到一个队列的消息,许多消费者可以尝试从一个队列接收数据。 这是我们如何代表一个队列:这里写图片描述
    消费具有与接收相似的含义。 消费者是一个主要等待接收消息的程序。
    请注意,生产者,消费者和broker不必驻留在同一个主机上; 确实在大多数应用程序中,它们不是。

    "Hello World"

    (使用.NET / C#客户端)

    在本教程的这一部分,我们将在C#中编写两个程序; 发送单个消息的生产者,以及消费者接收消息并将其打印出来。 我们将介绍.NET API中的一些细节,专注于这个非常简单的事情,只是为了开始。 这是一个Hello World的消息传递。

    在下图中,P是我们的生产者,C是我们的消费者。 中间的框是队列 - RabbitMQ代表消费者的消息缓冲区。
    这里写图片描述

    .NET客户端库

     RabbitMQ讲多种协议。 本教程使用AMQP 0-9-1,它是一种开放的通用协议,用于消息传递。 有许多不同语言的RabbitMQ客户端。 我们将使用RabbitMQ提供的.NET客户端。
    
     客户端支持.NET Core以及.NET Framework 4.5.1+。 本教程将使用.NET Core,因此您将确保安装并在PATH中。
    
     您也可以使用.NET Framework完成本教程,但是安装步骤将不同。
    
     客户端通过nuget分发,但也可以作为归档下载。
    
     本教程假定您在Windows上使用powershell。 在OSX / Linux上几乎任何shell都可以工作。
    

    建立

    首先让我们验证你在PATH中有.NET Core工具链:

    dotnet --help
    

    现在让我们生成两个项目,一个是生产者,一个是消费者:

    dotnet new console --name Send
    mv Send/Program.cs Send/Send.cs
    dotnet new console --name Receive
    mv Receive/Program.cs Receive/Receive.cs
    

    这将创建两个名为SendReceive的新目录。

    然后我们添加客户机依赖关系。

    cd Send
    dotnet add package RabbitMQ.Client
    dotnet restore
    cd ../Receive
    dotnet add package RabbitMQ.Client
    dotnet restore
    

    现在我们设置了.NET项目,我们可以编写一些代码。

    发送

    我们将致电我们的消息发布者(sender) Send.cs和我们的消息消费者 (receiver) Receive.cs。 发布者将连接到RabbitMQ,发送单个消息,然后退出。

    Send.cs中,我们需要使用一些命名空间:

    using System;
    using RabbitMQ.Client;
    using System.Text;
    

    设置类:

    class Send
    {
        public static void Main()
        {
            ...
        }
    }
    

    那么我们可以创建一个到服务器的连接:

    class Send
    {
        public static void Main()
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    ...
                }
            }
        }
    }
    

    连接摘要套接字连接,并对我们进行协议版本协商和认证等。 在这里,我们连接到本地机器上的代理 - 因此localhost。 如果我们想连接到不同机器上的代理,我们可以在此处指定其名称或IP地址。

    接下来,我们创建一个channel,这是大部分用于完成任务的API所在的地方。

    要发送,我们必须申报一个队列给我们发送; 那么我们可以将消息发布到队列中:

    using System;
    using RabbitMQ.Client;
    using System.Text;
    
    class Send
    {
        public static void Main()
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using(var connection = factory.CreateConnection())
            using(var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);
    
                string message = "Hello World!";
                var body = Encoding.UTF8.GetBytes(message);
    
                channel.BasicPublish(exchange: "",
                                     routingKey: "hello",
                                     basicProperties: null,
                                     body: body);
                Console.WriteLine(" [x] Sent {0}", message);
            }
    
            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
        }
    }
    

    声明队列是幂等的 - 只有当它不存在时才会被创建。 消息内容是一个字节数组,所以你可以编码你喜欢的任何东西。

    当上面的代码完成运行时,通道和连接将被回收释放。

    发送不起作用

    如果这是您第一次使用RabbitMQ,并且没有看到“已发送”消息,那么您可能会挠头,想知道什么地方可能是错误的。
    也许broker开始没有足够的可用磁盘空间(默认情况下,它至少需要50 MB空闲),因此拒绝接受消息。
    检查broker日志文件以确认并减少限制(如有必要)。 配置文件文档将显示如何设置disk_free_limit

    接收

    这就是我们的发布者。 我们的消费者是从RabbitMQ被推送消息,所以不同于发布单个消息的发布者,我们将继续运行,以收听消息并打印出来。

    代码(在Receive.cs中)具有与Send几乎相同的using 语句:

    using RabbitMQ.Client;
    using RabbitMQ.Client.Events;
    using System;
    using System.Text;
    

    设置与发布者相同; 我们打开一个连接和一个通道,并声明我们要消费的队列。注意这匹配Send发布者的队列。

    class Receive
    {
        public static void Main()
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue: "hello",
                                         durable: false,
                                         exclusive: false,
                                         autoDelete: false,
                                         arguments: null);
                    ...
                }
            }
        }
    }
    

    请注意,我们也在这里声明队列。 因为我们可能会在发布者之前启动消费者,所以我们要确保队列存在,然后再尝试从中消费消息。

    我们即将告诉服务器将队列中的消息传递给我们。 由于它将异步地推送我们的邮件,所以我们提供一个回调。 那就是EventingBasicConsumer.Received事件处理程序。

    using RabbitMQ.Client;
    using RabbitMQ.Client.Events;
    using System;
    using System.Text;
    
    class Receive
    {
        public static void Main()
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using(var connection = factory.CreateConnection())
            using(var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);
    
                var consumer = new EventingBasicConsumer(channel);
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine(" [x] Received {0}", message);
                };
                channel.BasicConsume(queue: "hello",
                                     noAck: true,
                                     consumer: consumer);
    
                Console.WriteLine(" Press [enter] to exit.");
                Console.ReadLine();
            }
        }
    }
    

    所有整合起来

    打开两个终端
    运行消费者:

    cd Receive
    dotnet run
    

    然后运行生产者:

    cd Send
    dotnet run
    

    消费者将通过RabbitMQ打印从发布者获得的消息。 消费者将继续运行,等待消息(使用Ctrl-C停止它),所以尝试从另一个终端运行发布者。

  • 相关阅读:
    #454. 【UER #8】打雪仗
    6496. 【GDOI2020模拟03.08】圣痕
    6495. 【GDOI2020模拟03.08】死星
    6494. 【GDOI2020模拟03.08】勘探
    NOI Online划水记
    6482. 【GDOI2020模拟02.22】代数几何(algebraic)
    6493. 【GDOI2020模拟03.04】迷宫
    6492. 【GDOI2020模拟03.04】多项式
    6491. 【GDOI2020模拟03.04】铺路
    #76. 【UR #6】懒癌
  • 原文地址:https://www.cnblogs.com/Wulex/p/6965054.html
Copyright © 2011-2022 走看看