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

一、简介

      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跨平台或扫描二维码关注

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

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

相关文章

红歌合唱之团结就是力量

今天,由王老师组织的班级红歌大合唱之“团结就是力量”圆满落幕!下面是整个合唱的视频,同学们个个都朝气蓬勃:以下是《团结就是力量》的全部歌词团结就是力量团结就是力量这力量是铁这力量是钢比铁还硬比钢还强向着法西斯蒂开火让…

Servlet API

1、书写一个servlet的方式 Servlet必须直接或间接实现 javax.servlet.Servlet 接口 通过继承javax.servlet.GenericServlet 类实现跨协议的 Servlet 通过继承javax.servlet.HttpServlet实现HTTP Servlet 自己定义个servlet,然后其他的java类都继承自己写好的servlet…

EventBus In eShop -- 解析微软微服务架构eShopOnContainers(四)

引言 大家好像对分析源码厌倦了,说实在我也会厌倦,不过不看是无法分析其后面的东西,从易到难是一个必要的过程。 今天说下EventBus,前几天园里的大神已经把其解刨事件总线(Event Bus)知多少,我…

基本数据类型、包装类、String三者之间的相互转换

package com.wdl.day13;import org.junit.Test;/** 包装类的使用:* 1.java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征** 2.掌握的:基本数据类型、包装类、String三者之间的相互转换****/ public class WrapperTest {//Strin…

很简单很简单的DBHelper类

记录一个简单的DBHelper类吧&#xff0c;用的时候在上来拿&#xff01; /// <summary>/// 数据库连接工具类/// </summary>public class DBHelper{string constr "Data Source.;Initial CatalogschoolDB;Integrated SecurityTrue";private SqlConnecti…

DDD理论学习系列(1)-- 通用语言

1.引言 在开始之前&#xff0c;我想我们有必要先了解以下DDD的主要参与者。因为毕竟语言是人说的吗&#xff0c;就像我们面向对象编程一样&#xff0c;那通用语言面向的是&#xff1f;DDD的主要参与者&#xff1a;领域专家开发人员领域专家&#xff1a;精通业务的任何人。开发…

定了!对于本周四(7.16日)抽奖活动取消简要说明,新抽奖活动暂定下周三(7.22日)...

大家好&#xff0c;我是雄雄&#xff0c;对于本周四&#xff08;7.16日&#xff09;抽奖活动取消简要说明&#xff0c;新抽奖活动暂定下周三&#xff08;7.22日&#xff09;&#xff0c;欢迎各位粉丝积极参与&#xff0c;奖品已经准备好了&#xff0c;你&#xff01;准备好了吗…

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

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

面试中经常会问的智力题,来看看你会做几道

转载自 面试中经常会问的智力题&#xff0c;来看看你会做几道 下面是大部分题目来自滴滴出行2017秋招题。开始头脑风暴吧~~~ 问题 question one 有50家人家&#xff0c;每家一条狗。有一天警察通知&#xff0c;50条狗当中有病狗&#xff0c;行为和正常狗不一样。每人只能通…

你喜欢什么样的课堂?

最近看了一本书《让课堂充满幽默》&#xff0c;里面有些内容还是觉得挺有道理的。书中开头就说&#xff1a;“大量的课件、复杂的网络&#xff0c;使得老师似乎成了信息管理员和媒体播放机&#xff0c;学生则成为了被灌输的对象”&#xff0c;看后&#xff0c;内心深处反问自己…

main()方法

main()方法的使用说明&#xff1a; main()方法作为程序的入口main()方法也是一个普通的静态方法main()方法可以作为我们与控制台交互的方式。&#xff08;之前&#xff1a;使用Scanner&#xff09;

实现自己的.NET Core配置Provider之EF

《10分钟就能学会.NET Core配置》里详细介绍了.NET Core配置的用法&#xff0c;另外我还开源了自定义的配置Provider&#xff1a;EF配置Provider和Yaml配置Provider。本文先来聊聊EF配置Provider的实现&#xff0c;其中会涉及到EntityFramework Core的知识&#xff0c;不熟悉也…

今天的雪糕格外好吃!

赤日炎炎&#xff0c;室外的温度超过30℃。午休罢&#xff0c;教室里一片寂静&#xff0c;大家都有一个目的——等待老师的进来&#xff0c;继续上课。偶尔有几位同学貌似等待焦急&#xff0c;遂将目光瞥向窗外&#xff0c;若有所思。还有几位好动同学在自己的座位上左右摇动&a…

洛谷P2296-寻找道路【日常图论,最短路,SPFA】

题目 一个有向图&#xff0c;要求满足要求的最短路径&#xff0c;要求为&#xff1a; 路径上的所有点的出边所指向的点都直接或间接与终点连通。 输入1 3 2 (3个点,2条边) 1 2 (1和2之间可以连接) 2 1 1 3 (从1到3) 输出1 -1 输入2 6 6 1 2 1 3 2 6 2 5 4 5 3…

活动 | Unity带你亲临王者荣耀KPL总决赛,领略电竞的魅力

《王者荣耀》是由腾讯出品的 Made with Unity的现象级游戏。在Unite Shanghai 2017中的案例专场&#xff0c;我们也曾邀请了《王者荣耀》项目组的技术总监邓君&#xff0c;分享过《王者技术修炼之路》。 从移动游戏到电子竞技&#xff0c;KPL(King Pro League)也是《王者荣耀》…

Java的并发编程中的多线程问题到底是怎么回事儿?

转载自 Java的并发编程中的多线程问题到底是怎么回事儿&#xff1f; 在我之前的一篇《再有人问你Java内存模型是什么&#xff0c;就把这篇文章发给他。》文章中&#xff0c;介绍了Java内存模型&#xff0c;通过这篇文章&#xff0c;大家应该都知道了Java内存模型的概念以及作…

DDD理论学习系列(2)-- 领域

1. 引言 领域一词&#xff0c;主要有以下两个意思&#xff1a; 一国主权所达之地。学术思想或社会活动的范围。 不管是指国家的主权范围也好还是学术活动范围&#xff0c;都是在讲一个范围&#xff0c;一个界限。比如我们常说的&#xff0c;学术领域、思想领域、技术领域、语…

最全、最详细的配置jdk十步法!

求关注求转发大家好&#xff0c;我是雄雄。今天给大家分享的是 如何配置jdk &#xff0c;还记得我当年刚开始自学编程时&#xff0c;jdk配置了好几天才配置好&#xff0c;说来也是惭愧啊。并且配置成功的步骤我自己都不知道是啥&#xff0c;因为当时是东找一个方法&#xff0c;…

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

在前一个教程中&#xff0c;我们创建了一个工作队列。工作队列背后的假设是每个任务会被交付给一个【工人】。在这一部分我们将做一些完全不同的事情--我们将向多个【消费者】传递信息。这种模式被称为“发布/订阅”。 为了说明这种模式&#xff0c;我们将构建一个简单的日志…

路径使用场景

路径的使用场景 路径适用的范围&#xff1a;jsp页面中link script img a form 等 如果访问的是其他服务器中的项目文件只可以使用绝对路径 如果访问的是同一个服务器中的其他项目推荐使用根路径 如果访问的是同一个服务器中的同一个项目中的文件推荐使用相对base标签的路径 修改…