介绍

先决条件

本教程假定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停止它),所以尝试从另一个终端运行发布者。

转载于:https://www.cnblogs.com/moyhui/p/8309062.html

RabbitMQ入门HelloWorld(C#)(翻译)相关推荐

  1. RabbitMQ 入门 Helloworld

    1.Windows下RabbitMQ的安装 下载Erlang,地址:http://www.erlang.org/download/otp_win32_R15B.exe ,双击安装即可(首先装) 下载R ...

  2. RabbitMQ入门到精通

    RabbitMQ 1. 消息中间件概述 1.1. 为什么学习消息队列 电子商务应用中,经常需要对庞大的海量数据进行监控,随着网络技术和软件开发技术的不断提高,在实战开发中MQ的使用与日俱增,特别是Ra ...

  3. RabbitMQ 入门:2. Exchange 和 Queue

    上文RabbitMQ 入门:1. Message Broker(消息代理)提到过 RabbitMQ 实现了 AMQP 这个协议(RabbitMQ 所支持的 AMQP 的版本是 0.9.1),这个协议的 ...

  4. RabbitMQ入门到掌握

    RabbitMQ入门到掌握 一.消息队列 1.MQ 的相关概念 1.2 什么是MQ 1.2 为什么要用MQ ①流量消峰 ②应用解耦 ③异步处理 1.3 MQ 的分类 ①ActiveMQ ②Kafka ...

  5. RabbitMQ入门到进阶

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...

  6. RabbitMQ入门到进阶(Spring整合RabbitMQSpringBoot整合RabbitMQ)

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) 2.为什么要 ...

  7. 超详细的RabbitMQ入门

    转载:超详细的RabbitMQ入门,看这篇就够了!-阿里云开发者社区 思维导图 一.什么是消息队列 消息指的是两个应用间传递的数据.数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象. ...

  8. RabbitMQ入门4:生产者、消费者演示;多个消费者平均压力、公平派遣;

    说明: (1)内容说明: ● 这儿我们会创建一个项目,演示RabbitMQ最基础的内容: 通过,这个最简单的例子,先了解:如何使用RabbitMQ,如何连接RabbitMQ,如何发送消息,如何接收消息 ...

  9. RabbitMQ 入门系列(10)— RabbitMQ 消息持久化、不丢失消息

    消息要保持"持久化",即不丢失,必须要使得消息.交换器.队列,必须全部 "持久化". 1. 生产者怎么确认 RabbitMQ 已经收到了消息? # 打开通道的确 ...

最新文章

  1. maven只打包java目录_ssm项目中maven对resources目录打包的路径_默认路径,自定义路径...
  2. java问题:错误: 找不到或无法加载主类 HelloWorld
  3. 七、压缩与解压缩命令
  4. html5 推送到桌面,Html5中的桌面通知Notification的实现
  5. 计算机网络英语第二章,计算机网络英文题库(附答案)chapter2.doc
  6. 在解决计算机主机,电脑主机噪音大怎么办 电脑主机噪音大解决方法【图文】...
  7. word表格图片自动适应表格大小_几招教你快速解决word文字、图片、表格排版问题,你肯定遇到过...
  8. 使用Spring Boot和Project Reactor处理SQS消息
  9. js中奇怪的问题 同步ajax,modal遮罩层
  10. Linux命令kill和signal
  11. vs2015+opencv3.2.0配置的一些小事情
  12. 三局两胜还是五局三胜?
  13. 算法5-----三个数大小比较
  14. Jvavscript- 跟着李南江学编程
  15. css横排文字光影效果_css实现发光文字,以及一点点js特效
  16. 业绩下滑、利润缩水,除了一直涨价,涪陵榨菜还有什么招数?
  17. Python基础入门之列表生成式
  18. 巴西支付Boleto对巴西外贸有多重要!?
  19. Dialog 对话框
  20. 购买老域名,利用桔子seo来查找域名的历史快照信息

热门文章

  1. STM32H743+CubeMX-两路FDCAN同时工作的终极方案(RTX5)
  2. 西贝莜面村员工手册_西贝那达慕草原美食节 引领文化生活新消费
  3. 【四】Java流程控制
  4. Java方法的反射(对反射的进一步认识)
  5. C/C++信息隐写术(一)之认识文件结构
  6. 计算机中2的四次方为啥是4位,计算机基础试题2(4页)-原创力文档
  7. linux脚本 sed,Linux脚本利器sed
  8. python中对字符串进行编码_Python 中的字符串编码
  9. 使用java代码发送zip文件到邮箱_Azkaban安装与使用(下)
  10. windowblinds 6_过年回家选车很重要!锐骐6强势对比纳瓦拉