介绍

先决条件

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

在哪里得到帮助

如果您在阅读本教程时遇到困难,可以 通过邮件列表与我们联系。

RabbitMQ是一个消息代理:它接受和转发消息。你可以把它想象成一个邮局:当你把邮件放在邮箱里时,你可以确定邮差先生最终会把邮件发送给你的收件人。在这个比喻中,RabbitMQ是邮政信箱,邮局和邮递员。

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

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

  • 生产只不过是发送而已。一个发送消息的程序是一个生产者

  • 队列是RabbitMQ内部的邮箱名称。尽管消息流经RabbitMQ和您的应用程序,但它们只能存储在队列中。甲队列仅由主机的存储器&磁盘限制约束,它本质上是一个大的消息缓冲器。许多生产者可以发送消息到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们代表队列的方式:

  • 消费与接受有类似的意义。一个消费者是一个程序,主要是等待接收信息:

请注意,生产者,消费者和经纪人不必驻留在同一主机上; 事实上在大多数应用程序中,他们没有

“你好,世界”

(使用.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+。本教程将使用RabbitMQ .NET客户端5.0和.NET核心,因此您将确保您已安装并在PATH中。

您也可以使用.NET Framework来完成本教程,但设置步骤会有所不同。

RabbitMQ .NET客户端5.0和更高版本通过nuget分发。

本教程假定您在Windows上使用PowerShell。在MacOS和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

这将创建两个名为发送和接收的新目录。

然后我们添加客户端依赖项。

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())
{
...
}
}
}
}

连接抽象出套接字连接,并为我们处理协议版本协商和认证等。在这里,我们连接到本地机器上的代理 - 因此是 本地主机。如果我们想连接到另一台机器上的经纪人,我们只需在此指定其名称或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();
}
}

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

当上面的代码完成运行时,通道和连接将被处理。这是我们的出版商。

这是整个Send.cs类

发送不起作用!

如果这是您第一次使用RabbitMQ,并且您没有看到“已发送”消息,那么您可能会抓住您的脑袋,想知道会出现什么问题。也许代理启动时没有足够的可用磁盘空间(默认情况下它至少需要50 MB空间),因此拒绝接受消息。检查代理日志文件以确认并在必要时减少限制。该配置文件文档会告诉你如何设置disk_free_limit。

接收

至于消费者,它是从RabbitMQ推送消息。因此,与发布单个消息的发布者不同,我们将不断地运行消费者来收听消息并将其打印出来。

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

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);
...
}
}
}
}

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

我们即将告诉服务器将队列中的消息传递给我们。由于它会异步推送消息,因此我们提供回调。这就是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停止它),所以尝试从另一个终端运行发布者。

RabbitMQ入门HelloWorld(C#)(翻译)的更多相关文章

  1. RabbitMQ 入门 Helloworld -摘自网络

    本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与实验,内容仅供参考. “Hello world” of RabbitMQ 1.Windows下RabbitMQ的安装 下载Erlang ...

  2. RabbitMQ 入门 Helloworld

    1.介绍 RabbitMQ 是信息传输的中间者.本质上,他从生产者(producers)接收消息,转发这些消息给消费者(consumers).换句话说,他能够按根据你指定的规则进行消息转发.缓冲.和持 ...

  3. [转]RabbitMQ入门教程(概念,应用场景,安装,使用)

    原文地址:https://www.jianshu.com/p/dae5bbed39b1 RabbitMQ 简介 RabbitMQ是一个在AMQP(Advanced Message Queuing Pr ...

  4. RabbitMQ学习总结 第二篇:快速入门HelloWorld

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  5. RabbitMQ入门-从HelloWorld开始

    从读者的反馈谈RabbitMQ 昨天发完<RabbitMQ入门-初识RabbitMQ>,我陆陆续续收到一些反馈.鉴于部分读者希望结合实例来讲 期待下篇详细,最好结合案例.谢谢! 哪都好,唯 ...

  6. RabbitMQ入门-高效的Work模式

    扛不住的Hello World模式 上篇<RabbitMQ入门-从HelloWorld开始>介绍了RabbitMQ中最基本的Hello World模型.正如其名,Hello World模型 ...

  7. Flask入门HelloWorld

    Flask入门HelloWorld Flask官网:http://flask.pocoo.org/ Flask中文翻译:http://dormousehole.readthedocs.io/en/la ...

  8. RabbitMQ入门:Hello RabbitMQ 代码实例

    在之前的一篇博客RabbitMQ入门:认识并安装RabbitMQ(以Windows系统为例)中,我们安装了RabbitMQ并且对其也有的初步的认识,今天就来写个入门小例子来加深概念理解并了解代码怎么实 ...

  9. .NET 环境中使用RabbitMQ RabbitMQ与Redis队列对比 RabbitMQ入门与使用篇

    .NET 环境中使用RabbitMQ   在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的 ...

随机推荐

  1. POST/有道翻译 有bug

    1.发现在翻译时地址没有变,那是POST请求. 2.通过fidder抓包工具抓取url 3.对data分析,发现每次salt和sign都在变化. 4.查看源码,先用站长工具http://tool.ch ...

  2. redis的hash类型

    1.简单描述 hash是一个string类型的field和value的映射表.添加和删除操作都是O(1)(平均)的复杂度.hash类型特别适合用于存储对象.在field的数量在限制的范围内以及valu ...

  3. wordpess关闭评论的方法,wordpress开发

    由于某种原因,需要把wordpress的评论关闭,下面讲一下方法. 在wordpress模板中,找到文章模板页面文件single.php,在里面找到 <?php comments_templat ...

  4. Github开源项目(企业信息化基础平台)

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...

  5. Django学习(3)模板定制

    在Django学习(一)一首情诗中,views.py中HTML被直接硬编码在代码之中,虽然这样便于解释视图是如何工作的,但直接将HTML硬编码到视图却不算一个好主意.因为: 对页面设计进行的任何改变都 ...

  6. while,until

    while ] 注释:中括号写的条件判断式中不能用<.=.>这类符号,要用-lt.-eq.-gt这类符号,且变量前要用$来取值 do sum=$(($sum+$i)) i=$(($i+)) ...

  7. iOS: FFmpeg编译和使用 学习

    ffmpeg是一个多平台多媒体处理工具,处理视频和音频的功能非常强大.目前在网上搜到的iOS上使用FFMPEG的资料都比较陈旧,而FFMPEG更新迭代比较快: 且网上的讲解不够详细,对于初次接触FFM ...

  8. 关于js代码执行顺序

    上网查了一下关于这个方面的资料,大部分都是关于两个script标签中的js代码和变量以及函数提升方面的知识. 1.两个script标签 <script> alert("我是代码块 ...

  9. AngularJS 模板

    一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器 ...

  10. SpringBoot初步

    1.创建maven 项目 quickstart类型 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...