一、简介

RabbitMQ是一个消息的代理器,用于接收和发送消息,你可以这样想,他就是一个邮局,当您把需要寄送的邮件投递到邮筒之时,你可以确定的是邮递员先生肯定会把邮件发送到需要接收邮件的人的手里,不会送错的。在这个比喻中,RabbitMQ就是一个邮箱,也可以理解为邮局和邮递员,他们负责把消息发送出去和用于接收信息。

RabbitMQ和邮局这两者之间的主要区别是它不会处理纸质邮件,取而代之的是接收、存储和发送二进制数据块,也就是我们通常所说的消息。

RabbitMQ和消息中,通常会使用一些专业术语。

生产:生产意味着就是发送。 发送消息的程序是一个生产者。下图代表一个消息的生产真:

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 71px; height: 51px;">

队列:这里的队列是指一个名称,但是名称所代表的队列实体寄存在RabbitMQ服务器端中。 虽然消息流过RabbitMQ和您的应用程序,但它们只能存储在队列中。 队列只受主机的内存和磁盘的限制,它本质上是一个大的消息缓冲区。 许多生产者可以发送消息到一个队列,许多消费者可以尝试从一个队列接收数据。 下图代表一个队列:

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 130px; height: 91px;">

消费:消费具有与接收相似的含义。 消费者是一个主要等待接收消息的程序。下图代表消息的消费者:

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 71px; height: 51px;">

二、(使用 Net/C# 客户端)

在这篇教程中我们将用C#写两个程序;一个是生产者,用于发送一个简单消息;一个是消费者,用于接收消息和把他们打印出来。我们将忽略一些.NET API的详细信息,专注于更简单的开始。这是一个关于"Hello World"简单的小例子。

在下图中, "P"是我们的消息生产者,"C"是我们消息的消费者。在中间的红色矩形框代表一个队列,也就是消息的缓冲区,RabbitMQ代表是消息的消费者。

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 392px; height: 59px;">

   Net客户端类库

RabbitMQ支持多种协议,本教程使用AMQP 0-9-1,这是一个针对消息的开放的、通用的协议。RabbitMQ使用了多种语言开发了针对不同环境的客户端。下面我们将使用由RabbitMQ提供的Net客户端。

这个客户端类库支持.NET Core以及.NET Framework 4.5.1 以上的版本。本教程将使用.NET Core,以便确保您安装在您的路径中。

你也可以使用 Net Framework 来完成本实例,只是安装步骤有些不同而已。

RabbitMQ的客户端类库已经部署到了NuGet上,并且您可以通过NuGet下载和使用。

本教程假定您正在使用Windows PowerShell。

三、安装

首先让我们确认您已经有了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

这将生成两个目录,一个目录是Send,另一个目录是Receive.

然后我们增加客户端的依赖

cd Send
dotnet add package RabbitMQ.Client
dotnet restore
cd ../Receive
dotnet add package RabbitMQ.Client
dotnet restore

现在我们已经有了两个项目安装完毕,可以开始写一些代码了。

四、发送消息

   frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 216px; height: 100px;">

我们会调用我们的消息发布者(发送者)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()){...}}}}

当前connection连接是一个抽象的套接字连接,为我们负责协议版本的协商和认证等。这里我们连接到本地机器上的消息代理--从此处的localhost关键字可以看出是本机。如果我们想连接到另一台机器上的一个消息代理,我们只需在这里指定它的名称或IP地址。

接下来,我们创建一个通道,这个API的主要功能就是把获得信息保存起来

要发送,我们必须声明一个队列,然后我们把消息发送到这个队列里面:

声明队列是一次性的,只有当它不存在时才会被创建。消息内容是字节数组,所以您可以编码任何您喜欢的内容。

当上面的代码完成运行时,通道和连接将被释放。

发送不成功的解决办法

如果这是您第一次使用RabbitMQ发送消息,但是你并没有看到“发送”的消息,那么你可能会挠着头想知道错误在什么地方。也许消息代理开始没有足够的可用磁盘空间(默认情况下,它需要至少50 MB),因此拒绝接受消息。必要时检查代理日志文件来确认和减少限制。配置文件的文档会告诉你如何设置disk_free_limit。

五、接收消息

以上就是我们的消息生产者,我们的消息的消费者是从RabbitMQ拉消息,因此不能像我们的消息发布者那样发布单一消息,我们需要保持我们的消费者程序持续运行,并且监听消息,如果有就获取并且打印出来。

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 216px; height: 100px;">

Receive.cs文件和Send.cs文件有一些很像的代码需要书写:

using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text;

消息接收者的设置和消息的发布者一样,我们要打开一个连接和一个通道,并且声明一个从中获取消息的队列,注意这个是和Send.cs文件中的发布者的队列相匹配的。

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接收事件处理程序所做的。

六、把它放在一起

打开两个端点。

运行消费者: 
 
       cd Receive

       dotnet run

然后运行生产者

cd Send

       dotnet Run

消费者将要打印消息生产者通过RabbitMQ发布的消息。消费者不能间断,必须保持持续运行,等待新消息的到来。当然也可以通过(Ctrl+C 来停止消费者)

好了,终于写完了,其实是我翻译的,有翻译不对的地方请谅解。

原文地址:http://www.cnblogs.com/PatrickLiu/p/6934745.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World相关推荐

  1. RabbitMQ系列教程之四:路由(Routing)

    在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息. 在本教程中,我们将为其添加一项功能 ,这个功能是我们将只订阅消息的一个子集成为可能. 例如,我们可以只将关键的 ...

  2. RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe)

    在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向多个[消费者]传递信息.这种模式被称为"发布/订阅 ...

  3. Unreal Engine 4 系列教程 Part 5:制作简单游戏

    原文:How to Create a Simple Game in Unreal Engine 4 作者:Tommy Tran 译者:Shuchang Liu 在本篇教程中,你将学习制作一个第一人称动 ...

  4. Win7新手系列教程:从安装到简单使用(新人必读)

    Win7教程第一课:我的电脑该安装哪个版本的Windows7 主要内容:1.Windows7最低配置要求是什么                      2.我的电脑可否安装Windows7      ...

  5. RabbitMQ系列教程之二:工作队列(Work Queues)

    今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题.   (使用.NET 客户端 进行事例演示) 在第一个教程中,我们编写了一个从命名队列中发送和接收消息的程序.在本教程中,我们将创建一个 ...

  6. html标题线,html系列教程--标题,水平线,注释以及段落

    HTML标题 标题,用来显示文章重要性的文字,包含了文章的主旨,类似于作文题目. 标题(Heading)是通过 - 等标签进行定义的,由大到小一次排列,h1为最大. 注意: 浏览器会自动地在标题的前后 ...

  7. RabbitMQ消息队列系列教程(一)认识RabbitMQ

    摘要 RabbitMQ是最为流行的消息中间件,是处理高并发业务的利器.本系列教程,将跟大家一起学习RabbitMQ. 目录 RabbitMQ是什么? RabbitMQ的特点是什么? 一.RabbitM ...

  8. 推荐系统系列教程之十七:简单却有效的Bandit算法

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十六期,今天按约推出第十七期:简单却有效的Bandit算法.希望粉丝朋友们多点"在看",多多转发,我会在 ...

  9. 【微信小程序系列】微信小程序超简单教程,基本语法,获取用户基本数据信息,实现对云数据库的增删改查及小程序外部api的引用示例(附源码)

    [微信小程序系列]微信小程序超简单教程 小程序项目结构 静态页面的构成 HTML:结构 css:样式 js:行为 小程序 页面全部存放在pages, 而且pages目录只能存放页面 页面包括4个文件, ...

最新文章

  1. 《阿丽塔》脑机接口正从科幻走向现实
  2. 强大的Mockito测试框架(转)
  3. 第17讲:aiohttp 异步爬虫实战
  4. JavaScript使用hash表方式实现数组去重。
  5. Angular2中的路由(简单总结)
  6. mysql pdm_mysql 生成pdm
  7. tomcat 转发 http接口的绝对路径文件
  8. C++ 设计模式 —— 策略模式(Strategy)
  9. php array_diff 用法
  10. 教你轻松又简单的绘制地铁线路图
  11. Findbugs使用指南及扫描内容解释
  12. 《Using OpenRefine》翻译~8
  13. 简述冯诺依曼体系结构计算机的工作原理。
  14. 解决 Cannot uninstall 'ipython'. It is a distutils installed project and thus we cannot accurately det
  15. 2021哔哩哔哩1024程序员节日第二弹:安全攻防挑战赛
  16. sqlserver2005和mysql_myecplise+mysql(或SQLserver2005)配置
  17. 如何在 Linux 中更新 Flatpak 软件包
  18. STM32开发实例 基于STM32单片机的智能机房系统
  19. 【转】腾讯 百度 网易游戏 华为Offer及笔经面经
  20. IT常用英文术语解释发音

热门文章

  1. 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)
  2. 生成二维码的 jQuery 插件:jquery.qrcode.js
  3. 如何使用VIM的Help
  4. .net 垃圾回收机制
  5. ISA服务器之域内×××用户在外网通过CA验证连接域内×××服务器
  6. UOS LoongArch 上成功安装.NET Core 3.1
  7. 理论修炼之ETCD,高一致性Key-Value服务提供者中的佼佼者
  8. .net core 微服务下的手工签名实现,以及消除中文乱码
  9. 大牛领导单独找我聊了两句:搞框架的同时别忘了算法
  10. 如何在 C# 8 中使用 Channels