RabbitMQ入门HelloWorld(C#)(翻译)
介绍
先决条件
本教程假定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();
}
}
声明一个队列是幂等的 - 只有当它不存在时才会被创建。消息内容是一个字节数组,所以你可以编码任何你喜欢的地方。
当上面的代码完成运行时,通道和连接将被处理。这是我们的出版商。
发送不起作用! 如果这是您第一次使用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();
}
}
}
把它放在一起
打开两个终端。
运行消费者:
cd Receive
dotnet run
然后运行生产者:
cd Send
dotnet run
消费者将通过RabbitMQ打印从发布者处获得的消息。消费者将继续运行,等待消息(使用Ctrl-C停止它),所以尝试从另一个终端运行发布者。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- HTTPS 基本原理
- 自动化运维平台Spug测试
- 如何提升前端基建的效能价值?
- iTerm2安装和配置
- 最新最全的mutect2教程
- Flutter基础widgets教程-CupertinoAlertDialog篇
- Spring的Controller是单例还是多例?怎么保证并发的安全
- 用TypeScript装饰器实现一个简单的依赖注入
- PING问题解决方法_20190305
- 前端需要掌握的设计模式
- @vue/composition-api速成课(通俗易懂版)
- 新1期视频第14课und异常中断模式的bug以及对应的解决方法
- 第一课:linux设备树的引入与体验(基于linux4.19内核版本)
- 第二课:linux设备树的规范(dts和dtb)
- 二叉树剪枝了解一下~