【c#】RabbitMQ学习文档(一)Hello World

一、简介

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

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

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

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

    

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

   

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

    

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

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

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

(P) -> [|||] -> (C)



   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
复制代码

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

四、发送消息

            (P) -> [|||]

   我们会调用我们的消息发布者(发送者)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的主要功能就是把获得信息保存起来

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

复制代码
 1  using System;
 2        using RabbitMQ.Client;
 3        using System.Text;
 4 
 5        class Send
 6        {
 7            public static void Main()
 8            {
 9                var factory = new ConnectionFactory() { HostName = "localhost" };
10                using(var connection = factory.CreateConnection())
11                using(var channel = connection.CreateModel())
12                {
13                    channel.QueueDeclare(queue: "hello",
14                                  durable: false,
15                                  exclusive: false,
16                                  autoDelete: false,
17                                  arguments: null);
18 
19                    string message = "Hello World!";
20                    var body = Encoding.UTF8.GetBytes(message);
21 
22                    channel.BasicPublish(exchange: "",
23                                  routingKey: "hello",
24                                  basicProperties: null,
25                                  body: body);
26                    Console.WriteLine(" [x] Sent {0}", message);
27                }
28 
29                Console.WriteLine(" Press [enter] to exit.");
30                Console.ReadLine();
31            }
32        }
复制代码


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

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

    发送不成功的解决办法

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


五、接收消息

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

[|||] -> (C)


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

复制代码
 1 using RabbitMQ.Client;
 2        using RabbitMQ.Client.Events;
 3        using System;
 4        using System.Text;
 5 
 6        class Receive
 7        {
 8            public static void Main()
 9            {
10               var factory = new ConnectionFactory() { HostName = "localhost" };
11               using(var connection = factory.CreateConnection())
12               using(var channel = connection.CreateModel())
13               {
14                    channel.QueueDeclare(queue: "hello",
15                                  durable: false,
16                                  exclusive: false,
17                                  autoDelete: false,
18                                  arguments: null);
19 
20                    var consumer = new EventingBasicConsumer(channel);
21                    consumer.Received += (model, ea) =>
22                    {
23                        var body = ea.Body;
24                        var message = Encoding.UTF8.GetString(body);
25                        Console.WriteLine(" [x] Received {0}", message);
26                    };
27                   channel.BasicConsume(queue: "hello",   noAck: true,    consumer: consumer);
28 
29                    Console.WriteLine(" Press [enter] to exit.");
30                    Console.ReadLine();
31                }
32            }
33        }
复制代码


六、把它放在一起

    打开两个端点。

    运行消费者:
 
       cd Receive

       dotnet run

    然后运行生产者

       cd Send

       dotnet Run

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

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

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

转载于:https://www.cnblogs.com/wyt007/p/9065639.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是状态转换图

通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。此外状态转换图还指明了作为特定事件的结果系统将做哪些动作(例如,处理数据)。因此状态转换图提供了行为建模机制。

Python学习笔记三

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 一、函数的定义 Python中定义一个函数需要使用def语句,依次确定函数名、参数及函数体内容: #一个求绝对值的函数 def my_abs(x):i…

oracle中如何分页,Oracle中操作分页

mysql中分页的写法:select t.* from tbl_user t order by t.id limit $offset , $perpage$currentPage 1;//当前页码其中后面$sql:with partdata as (select rownum rowno,t.* from tablename t where column1090order by column) select * from partda…

Flask爱家租房--发布新房源(保存房屋图片)

0.页面展示效果 1)首先房东填写房屋信息; 2)当房东填写发布的房源信息之后,隐藏(hide)刚才填写信息的界面,同时显示(show)上传房屋图片的界面。 1.后端代码 api.route("/houses/image&q…

数字的处理 :小数点四舍五入

js取float型小数点后两位数的方法 转载 发布时间:2014年01月18日 17:03:32 投稿:shangke 我要评论 js中取小数点后两位方法最常用的就是四舍五入函数了,前面我介绍过js中四舍五入一此常用函数,这里正好用上,下面…

如何成为一名优秀的C程序员

问题的提出 每过一段时间我总会收到一些程序员发来的电子邮件,他们会问我是用什么编程语言来编写自己的游戏的,以及我是如何学习这种编程语言的。因此,我认为在这篇博文里列出一些有关C语言的最佳读物应该能帮到不少人。如果你知道其它的优秀…

CFS调度器

一、前言 随着内核版本的演进,其源代码的膨胀速度也在递增,这让Linux的学习曲线变得越来越陡峭了。这对初识内核的同学而言当然不是什么好事情,满腔热情很容易被当头浇灭。我有一个循序渐进的方法,那就是先不要看最新的内核&#…

oracle索引分类与区分,深入理解Oracle表(6):堆组织表(HOT)和索引组织表(IOT)的区别...

摘要:堆表:又称堆组织表,常用的表类型,以堆的方式管理,当增加数据时,将使用段中第一个适合数据大小的空闲空间。当删除数据时,留下的空间允许以后的DML操作重用。 堆组织表(heap table)应用中99…

Flask爱家租房--发布新房源(总结)

重点总结 学习过程中,发现house_id贯穿两个接口内容,现对后端逻辑部分做以下总结: 1)房东首先在前端填写房屋的基本信息,此时通过newhouse.js文件$("#form-house-info").submit(function (e) {…}进行处理&…

关系的三类完整性约束

规则2.1实体完整性规则(Entity Integrity)若属性A是基本关系R的主属性,则属性A不能取空值空值就是“不知道”或“不存在”或“无意义”的值例: 选修(学号,课程号,成绩) “学号、课…

[QNAP crontab 定時執行程式

注意要自動執行的 sh 檔不要放在 /root 裡, 不然韌體更新後檔案會不見, 要放在個人帳號的資料夾,例如 /share/homes/帳號/ QNAP 的 crontab 放在 /etc/config/crontabvi /etc/config/crontab 例如要每日5:00執行 backup.sh 的話,加上這行 00 5 * * * /s…

调整标志位方法oracle,面试题(二)(示例代码)

1.查找/us/oc al/nginx/ogs下更改时间在7天前以log 后极的文件井移动到sr/oca/nginx/log/backup下(至少两种方法)2. Centos 查看某个进程的环境安量3.简述DNS迭代查询和递归直询的区别4.简述TCP三次握手过程以及涉及到的状态(可画草图) ?5.统计TCP连接状态(至少两种方法)6.发现…

国际最具潜力IT专业认证

正如很多的争论一样,IT认证也是现在争论的热点,在IT专业人士的世界里,IT认证对于其职业规划有着很大的影响。在时下究竟哪个认证才具有最大意义呢?本文罗列了十个最具潜力的技术认证,一起来看看都有哪些吧!…

关系代数

关系代数是一种抽象的查询语言,它用对关系的运算来表达查询关系代数运算对象是关系运算结果亦为关系关系代数的运算符有两类:集合运算符和专门的关系运算符

设计模式的六大原则

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更加容易被他人理解、保证代码可靠性。设计模式是代码编制真正工程化(工程化即系统化、模块化、规范化的一个过程。指将具有一定规模数量的单个…

作业7

stuNum 201709090072 print(年级是:stuNum[0:4]) print(专业编号是: stuNum[4:9]) print(序号是: stuNum[-3:]) stuNum 440982201812111876 print(所在省市:stuNum[0:2]) print(所在地区:stuNum[2:4]) print(所在县区:stuNum[4:…

linux进程退出没有log,Linux下应用进程消失原因分析-Go语言中文社区

应用部署在Linux环境下,如果出现未知原因导致应用进程被杀(应用日志中没有任何异常现象,日志出现中断现象),如果对于进程消失原因没有特别明确的方向,可以考虑从系统日志(/var/log/messages)方面查找原因。 命令参考egrep -i kill…

数学是成就卓越开发人员的必备技能

编者按:原文作者Alan Skorkin是一名软件开发人员,他在博客中分享对软件开发相关的心得,其中有很多优秀的文章,本文就是其中一篇,作者认为:成为优秀的开发人员,可以没有数学技能,但成…

Flask爱家租房--celery(总结)

0. celery整体逻辑图 个人理解为:此处的客户端client与以往定义的客户端(前端)并不一样,角色相当于以往的后端逻辑处理代码,即发布任务的一方,只是相当于处理者worker而言是客户端。 1.准备工作&#xff1…