zoukankan      html  css  js  c++  java
  • 【译】RabbitMQ:"Hello World"

    简介

      RabbitMQ是一个消息代理。从本质上讲,它从消息生产者处接收消息,然后传递给消息的消费者。它在消息的生产者和消费者之间根据你指定的规则对消息进行路由、缓存和持久化。

    RabbitMQ通常使用如下术语:

    • 生产(Producing),表示消息的发送。发送消息的程序被称为生产者。我们画一个图来表示它,如下所示:

                          

    • 队列(Queue),表示邮箱的名称,它存在于RabbitMQ服务器中。尽管消息在RabbitMQ和你的应用程序间流转,但它们只能存储与RabbitMQ内部的队列中。队列不会有任何限制,它可以存放任意多的消息,就像一个无限量的缓存一般。多个生产者可以向同一个队列发送消息,多个消费者也可以尝试从同一个队列中读取消息。一个队列可以被画成下面这样在其上有一个名称的图形:

                        

    • 消费(Consuming),表示消息的接收。消费者表示通常都在等待接收消息的程序。画图的时候给它标记一个“C”:

                          

    需要注意的是,生产者、消费者和代理并不必驻留于同一个服务器上面;通常情况下,他们是分部在不同的机器上面的。

    Hello World

    使用.NET/C#客户端

    在教程的这一部分,我们将用C#写两个程序;一个发送一条信息的生产者和一个接收并打印消息的消费者。我们会略过.NET API的一些细节,仅仅专注于如何完成这个简单的程序,传输内容为“Hello World”的消息。

    下图中,“P”表示生产者,“C”表示消费者。中间的方框,表示一个队列--RabbitMQ为消费者提供的一个消息缓存。

               

    .NET 客户端库

    RabbitMQ遵循AMQP协议,一个关于消息发送的开放、通用协议。现在已经有很多不同编程语言实现的AMQP的客户端。我们将使用由RabbitMQ提供的.NET客户端。

    下载客户端库的包,按照描述去检查它的签名。提取包的内容,把“RabbitMQ.Client.dll”程序集复制到你的工作目录下。

    你需要确认你的系统中能找到C#的编译器csc.exe,你可能需要把目录“;C:\WINDOWS\Microsoft.NET\Framework\v3.5”(需要根据你实际的安装情况,修改目录中.NET版本)添加到你的Path中。

    现在我们已经有了.NET客户端的二进制程序,可以写些代码了。

    发送(Sending

                      

    我们把消息的发送者称为Send.cs,消息的接收者称为Receive.cs。消息发送者将连接到RabbitMQ,发送一条消息,然后退出。

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

    1 using System;
    2 using RabbitMQ.Client;
    3 using System.Text;

    设置类

    1 class Send
    2 {
    3     public static void Main()
    4     {
    5         ...
    6     }
    7 }

    然后创建一个到RabbitMQ服务的链接

     1 class Send
     2 {
     3     public static void Main()
     4     {
     5         var factory = new ConnectionFactory() { HostName = "localhost" };
     6         using (var connection = factory.CreateConnection())
     7         {
     8             using (var channel = connection.CreateModel())
     9             {
    10                 ...
    11             }
    12         }
    13     }
    14 }

    该链接抽象了套接字连接,为我们关注协议版本协定和身份认证等。在这里,我们连接到了一个本地的代理,因此使用的是localhost。如果我们想连接到其他机器的代理,只需要简单在在这里指定该机器的名称或者Ip地址即可。

    接下来我们创建信道(Channel),完成工作的很多API都在里面。

    为了发送消息,我们必须申明一个队列,然后才能将消息发布其中:

     1 using System;
     2 using RabbitMQ.Client;
     3 using System.Text;
     4 
     5 class Send
     6 {
     7     public static void Main()
     8     {
     9         var factory = new ConnectionFactory() { HostName = "localhost" };
    10         using(var connection = factory.CreateConnection())
    11         using(var channel = connection.CreateModel())
    12         {
    13             channel.QueueDeclare(queue: "hello",
    14                                  durable: false,
    15                                  exclusive: false,
    16                                  autoDelete: false,
    17                                  arguments: null);
    18 
    19             string message = "Hello World!";
    20             var body = Encoding.UTF8.GetBytes(message);
    21 
    22             channel.BasicPublish(exchange: "",
    23                                  routingKey: "hello",
    24                                  basicProperties: null,
    25                                  body: body);
    26             Console.WriteLine(" [x] Sent {0}", message);
    27         }
    28 
    29         Console.WriteLine(" Press [enter] to exit.");
    30         Console.ReadLine();
    31     }
    32 }

    申明一个队列是幂等的,它仅仅会在申明的队列不存在于RabbitMQ中时才被创建。消息的内容是字节数组,所以,你可以使用任何喜欢的方式对消息进行编码。

    当上面的代码运行结束,信道和链接将会被释放。

    Send.cs的完整代码在这里。

    发送无法执行

    如果这是你第一次使用RabbitMQ,而且未看到已发送的消息,你一定会搔首疑惑是出了什么问题。也许是因为代理运行在没有足够空闲硬盘空间的机器上(默认情况下,代理需要至少50MB的空闲空间)而导致拒绝接收消息。通过查看代理的日志文件可以确认,同时如果有必要降低该项限制。配置文件文档可以告诉你如何设置(disk_free_limit)。

    接收

    上面那些是关于发送者的。RabbitMQ将消息压入接收者,所以和发布一条消息的发送者不一样,我们要保持接收者一直运行着去监听消息然后打印出来。

                      

    Receive.cs的代码需要引用和Send.cs中差不多相同的命名空间:

    1 using RabbitMQ.Client;
    2 using RabbitMQ.Client.Events;
    3 using System;
    4 using System.Text;

    类的设置和发送者是相同的;我们打开一个链接和一个信道,申明一个我们将要消费的队列。注意队列需要和发送者中申明的队列相匹配。

     1 class Receive
     2 {
     3     public static void Main()
     4     {
     5         var factory = new ConnectionFactory() { HostName = "localhost" };
     6         using (var connection = factory.CreateConnection())
     7         {
     8             using (var channel = connection.CreateModel())
     9             {
    10                 channel.QueueDeclare(queue: "hello",
    11                                      durable: false,
    12                                      exclusive: false,
    13                                      autoDelete: false,
    14                                      arguments: null);
    15                 ...
    16             }
    17         }
    18     }
    19 }

    注意在这里申明的这个队列。我们可能在运行发送者前运行接收者,需要确保在消费这个队列之前队列已经存在。

    我们将要告诉RabbitMQ服务从哪个队列传递消息给我们。因为该队列将压入异步消息给我们,我们提供回调。这就是EveningBasicConsumer.Received事件处理器做的事情了。

     1 using RabbitMQ.Client;
     2 using RabbitMQ.Client.Events;
     3 using System;
     4 using System.Text;
     5 
     6 class Receive
     7 {
     8     public static void Main()
     9     {
    10         var factory = new ConnectionFactory() { HostName = "localhost" };
    11         using(var connection = factory.CreateConnection())
    12         using(var channel = connection.CreateModel())
    13         {
    14             channel.QueueDeclare(queue: "hello",
    15                                  durable: false,
    16                                  exclusive: false,
    17                                  autoDelete: false,
    18                                  arguments: null);
    19 
    20             var consumer = new EventingBasicConsumer(channel);
    21             consumer.Received += (model, ea) =>
    22             {
    23                 var body = ea.Body;
    24                 var message = Encoding.UTF8.GetString(body);
    25                 Console.WriteLine(" [x] Received {0}", message);
    26             };
    27             channel.BasicConsume(queue: "hello",
    28                                  noAck: true,
    29                                  consumer: consumer);
    30 
    31             Console.WriteLine(" Press [enter] to exit.");
    32             Console.ReadLine();
    33         }
    34     }
    35 }

    完整的Receive.cs类在这里。

    组合在一起

    你可以引用RabbitMQ.NET客户端程序集,然后编译Send.csReceive.cs。我们将使用命令行(cmd.execsc)编译和运行这些代码。或者你可以使用Visual Studio

    1 $ csc /r:"RabbitMQ.Client.dll" Send.cs
    2 $ csc /r:"RabbitMQ.Client.dll" Receive.cs

    然后运行可执行文件

    1 $ Send.exe

    接着运行接收者

    1 $ Receive.exe

    接收者会打印从RabbitMQ接收到的消息。接收者一直运行等待新消息(使用Ctrl+C中止),所以可以尝试在不同的终端运行发送者。

    如果你希望在队列上做检查,使用rabbitmqctl list_queues.

    Hello World!

     

    现在是时候进入到第二部分去创建一个工作队列了。

    原文链接:http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

  • 相关阅读:
    使用vue来开发一个下拉菜单组件(2)
    使用vue来开发一个下拉菜单组件(1)
    在Vue中引入Bootstrap,Font-awesome
    九宫格表格样式
    web upload 上传多张图片实例
    input 的multiple 上传多个文件
    常用 验证码 JS 代码
    最全 H5 form 表单 + 正则验证
    mysql的指令
    Ant编译MapReduce程序
  • 原文地址:https://www.cnblogs.com/chen108/p/4940983.html
Copyright © 2011-2022 走看看