原文地址:http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

介绍

RabbitMQ是一个消息实体服务(broker):它接收及转发消息。你可以把它想象成一个邮局:当你把你想要寄送的邮件放进邮箱里时,你能够确信邮局的派送员最终会把你的这封邮局送到这信的收件者手中。以这个类比来说,RabbitMQ就是邮箱,邮局和邮局的派送员。
 
RabbitMQ和这个邮局最大的区别,是RabbitMQ不是与纸张打交道,而是接受、储存和转发二进制数据块——消息。
 
RabbitMQ 和一般通信中使用的一些术语:
 
生产就只是意味着发送。一个发送消息的程序就是生产者:
 
队列是存在于RabbitMQ里的一个邮箱的名字。尽管消息流过RabbitMQ和你的应用程序,但他们只被存储于队列里。队列只受限于主机的内存和磁盘。它本质上是一个很大的消息缓冲区。一些生成者能够发送消息到一个队列里,同时一些消费者可以尝试从那个队列里接受数据。下图就是我们描述的一个队列:
 
消费有着类似于接收的意思。一个消费者就是一个主要等待接收消息的程序:
 
注意:生产者、消费者,以及消息实体服务不一定是寄居于同一台主机;事实上在大部分应用中,它们不是在同一台主机里。

“Hello World”

注意:这个教程中的例子,假设你已经安装了RabbitMQ,而且运行在本地的标准端口(5672)。万一你使用了不同的主机,端口或证书,那你需要调整连接设置。

(使用 .NET/C# Client)

在这部分教程中,我们将用C#来写两个程序:一个用来发送一条消息的生成者,和一个接受消息并把消息打印出来的消费者。我们将忽略.net client API 中的一些细节,作为一个开始我们只专注于这些很简单的东西。这是一个“Hello World”消息。
 
在下面的示意图中,“P”就是我们的生成者,"C"就是我们的消费者。中间的盒子就是一个队列,队列就是RabbitMQ 为消费者保留的一个消息缓冲区。
.Net 客户端类库
RabbitMQ 可以使用多种协议。这个教程中使用AMQP 0-9-1,这是一个消息通信中开放而多用途的协议。对于RabbitMQ,可以使用多种不同的语言写成的客户端。我们这里将使用RabbitMQ提供的.net 客户端。
这个客户端支持.Net Core,跟支持.net framework4.5.1以上一样。在这个教程中将使用RabbitMQ  .net client 5.0 和.net core,所以你必须确保你已经安装了,而且在你的PATH里。
你同样可以使用.net framework来完成这个教程中的示例,但是建立项目的步骤将会不一样。
RabbitMQ .NET client 5.0 及最新版通过nuget发布。
这个教程假设你的windows是使用了powershell。在MacOS和Linux几乎任何shell都可以。

建立项目

首先我们先来确认.net core toolchain 在PATH:
 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
这些命令将生成两个名为Send和Receive的目录。
 
然后我们添加客户端依赖项目。
cd Send
dotnet add package RabbitMQ.Client
dotnet restore
cd ../Receive
dotnet add package RabbitMQ.Client
dotnet restore
现在我们已经建立了我们需要的.net项目,我们就可以在这两个项目中写一些代码了。
 

发送

我们将把我们的消息发布者(发送者)取名为send.cs,消费者(接收者)取名为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。
然后是创建一个通道,大部分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,而且你没有看到你发送的消息,你可能会抓耳挠腮地在想,到底是哪里出错了。这可能是消息服务实体启动时没有足够的可用磁盘空间(默认是至少需要50M的可用空间),而导致它拒绝接受消息。如果需要的话,检查消息服务实体日志来确认和减少这种限制。这个 configuration file documentation(配置文档)将告诉你如何设置disk_free_limit
 

接受

 
上面是我们的发布者。我们的消费者是从RabbitMQ中拉取消息,接受者不同于发布者只发布一条消息,我们将保持接收者一直监听消息及将其打印出来。
这个代码(Receive.cs)几乎使用了跟Send一样的命名空间:
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",
autoAck: true,
consumer: consumer); Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}

这是Receive.cs的完整代码

 
把生产者和消费者组合在一起
打开这两个终端。
运行消费者:
cd Receive
dotnet run

然后运行生成者:

cd Send
dotnet run
消费者将取得发布者发布到RabbitMQ的消息,并将它打印出来。消费者将继续保持运行,以等待新的消息(使用Ctrl+C来停止),所以可以尝试在另一个终端运行发布者。
 
 
PS:这是第一次翻译,翻译得不好,原因之一是自己对于RabbitMQ不熟,由于目前工作中右接触到RabbitMQ,所以自己就正在补这方面的知识,自己也顺便尝试一下翻译,自己感觉翻译真的是个有点揪心的事,很多英文句子看起来很简单,但是翻译出来的中文,却总觉得怪怪的。
如果你是使用.net framwork,一样是通过nuget获取RabbitMQ.Client的引用,其它的一样,这个在博客园有很多的例子,可以自己去找一下。

(译)RabbitMQ ——“Hello World”的更多相关文章

  1. [译]RabbitMQ教程C#版 - “Hello World”

    [译]RabbitMQ教程C#版 - “Hello World”   先决条件本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需 ...

  2. [译]rabbitmq 2.5 Where’s my message? Durability and you

    我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. There’s a dirty secret about creating queues and exchanges in ...

  3. [译]rabbitmq 2.4 Multiple tenants: virtual hosts and separation

    我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. With exchanges, bindings, and queues under your belt, you mig ...

  4. [译]rabbitmq 2.2 Building from the bottom: queues

    我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. You have consumers and producers under your belt, and now you ...

  5. [译]rabbitmq 2.1 Consumers and producers (not an economics lesson)

    我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. For now, all you need to know is that producers create messag ...

  6. [译]RabbitMQ教程C#版 - 工作队列

    先决条件 本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以 ...

  7. [译]RabbitMQ教程C#版 - 远程过程调用(RPC)

    先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...

  8. [译]RabbitMQ教程C#版 - 主题

    先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...

  9. [译]RabbitMQ教程C#版 - 路由

    先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...

  10. [译]RabbitMQ教程C#版 - 发布订阅

    先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...

随机推荐

  1. hdoj--3339--In Action(最短路+01背包)

    In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. [POI 2007] 堆积木

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1109 [算法] DP [代码] #include<bits/stdc++.h& ...

  3. SpringAop中JoinPoint对象

    来自:http://blog.csdn.net/it_zouxiang/article/details/52576917 JoinPoint的用法 JoinPoint 对象 JoinPoint对象封装 ...

  4. linux系统下块设备驱动程序

    顾名思义,块设备驱动程序就是支持以块的方式进行读写的设备.块设备和字符设备最大的区别在于读写数据的基本单元不同.块设备读写数据的基本单元为块,例 如磁盘通常为一个sector,而字符设备的基本单元为字 ...

  5. Tomcat安全设置与优化详解(非原创)

    一.Tomcat简介二.Tomcat安全设置三.Tomcat优化四.参考文章   一.Tomcat简介 Tomcat 是 Apache软件基金会下的一个免费.开源的WEB应用服务器,它可以运行在 Li ...

  6. oracle scott趣事

    Oracle里面是scott是个什么用户呢? 这个就要追朔到Oracle的创业阶段了, 1977年6月,埃里森,Bob Miner和Ed Oates在硅谷共同创办了一家名为软件开发实验室(Softwa ...

  7. Android之Action Bar

    Action Bar在实际应用中,很好地为用户提供了导航,窗口位置标识,操作点击等功能.它出现于Android3.0(API 11)之后的版本中,在2.1之后的版本中也可以使用. 添加与隐藏Actio ...

  8. 《剑指offer 第二版》题解

    剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...

  9. [原创]C++中一些重要概念

    1.虚函数 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数.当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予 ...

  10. background-attachment css3属性

    <style type="text/css"> body{ margin: 0; } .zhan{ width: 100%; height: 500px; backgr ...