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

  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/chen108/p/4940983.html
Copyright © 2011-2022 走看看