RabbitMQ指南(C#)(一)Hello World

RabbitMQ是一个消息代理,基本思路很简单:接收和推送消息。你可以把它当做是邮局,当你把信件放进邮箱里时,你可以非常的确信邮递员一定会把信件交给收件人。RabbitMQ就是一个邮箱,邮局以及快递员。

RabbitMQ就是一个邮箱,邮局以及快递员。

和邮局的不同的是,RabbitMQ处理的不是信纸,而是接收,存储,转发二进制的消息数据。

以下是RabbitMQ中的一些术语:

  • 生产(Producing)就是发送。发送消息的程序就是生产者(Producer)。生产者用“P”代表,如下图

  • 队列(queue)是信箱在RabbitMQ中的名称。虽然消息是RabbitMQ和应用程序之间进行传递,但它们也可以被存储在队列中。队列的大小没有任何限制,你可以存储任意多的消息进队列到无限缓存当中。可以多个生产者发送消息到同一个队列,也可以多个消费者从同一个队列接收消息。队列表示如下图

  • 消费(Consuming)的意思是接收。等待接收消息的程序称为消费者(Consumer),用一个“C“代表,如下图

   注意:生产者,消费者,代理一般放在不同的服务器上。

Hello World

这部分实现两个程序,生产者发送一个简单的消息,然后接收者接收消息并显示在屏幕上,发送的消息内容是”Hello world”。

如下图示,”P”是生产者,”C”是消费者。中间的长方体是队列,用作RabbitMQ的消息缓存,代消费者使用。

可以通过Nuget安装RabbitMQ的客户端程序包

发送

命名消息发送器为Sende.cs,消息接收器为Receive.cs。发送器连接RabbitMQ,发送一个消息,然后退出。

在Send.cs中创建连接,代码如下

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())
            {
                ...
            }
        }
    }
}

这个连接封装了Socket连接,提供协议版本制定和认证等。这里我们连接本机上的代理,如果要连接其它服务器,只要指定机器名或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推送过来的消息,所以不像发送器只发送单一的消息,接收器需要监听消息并显示。

Receive.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,用于处理接收到的消息。

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",
                                 noAck: true,
                                 consumer: consumer);

            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
        }
    }
}

运行

建立两个控制台项目Send和Receive,分别运行以上代码。

接收器通过RabbitMQ接收来自发送器的消息并显示,接收器会一直运行等待消息。

如果要检查队列,可以使用命令 rabbitmqctl list_queues

时间: 2024-10-11 04:35:30

RabbitMQ指南(C#)(一)Hello World的相关文章

RabbitMQ指南之一:"Hello World!"

为什么要使用MQ消息中间件?它解决了什么问题?关于为什么要使用消息中间件?消息中间件是如何做到同步变异步.流量削锋.应用解耦的?网上已经有很多说明,我这里就不再说明了,读者可以参考(https://www.jianshu.com/p/2820561158c4).我在接下来的RabbitMq系列博客里会将官方的讲解翻译过来,同时加以自己的理解整理成博客,希望能和大家共同交流,一起进步. RabbitMq原理图 1.RabbitMq简介 RabbitMq是一个消息中间件:它接收消息.转发消息.你可以

RabbitMQ指南之二:工作队列(Work Queues)

在上一章的指南中,我们写了一个命名队列:生产者往该命名队列发送消息.消费从从该命名队列中消费消息.在本章中,我们将创建一个工作队列,用于在多个工作者之间分配耗时的任务.工作队列(即任务队列)的主要思想是避免立即执行那些需要等他们执行完成的资源密集型任务.相反,我们将任务安排在稍后完成.我们将任务封装为消息并将其发送到队列,后台运行的工作进程将取出任务并执行完成.如果你启动了多个工作者,这些任务将在多个工作者之间分享. 这个概念也即我们说的异步,在项目中,有时候一个简单的Web请求,后台要做一系统

RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)

在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者.本章将会讲解完全不一样的场景: 我们会把一个消息转发给多个消费者,这种模式称之为发布-订阅模式. 为了阐述这个模式,我们将会搭建一个简单的日志系统,它包含两种程序:一种发送日志消息,另一种接收并打印日志消息.在这个日志系统里,每一个运行的消费者都可以获取到消息,在这种情况下,我们可以实现这种需求:一个消费者接收消息并写入磁盘,另一个消费者接收消息并打印在电脑屏幕上.简单来说,生产者发布的消息将会以广播的形式

RabbitMQ指南(Java)

原文地址:http://www.rabbitmq.com/getstarted.html 翻译得不好,欢迎指出. 一.Hello World 1.基本概念介绍 RabbitMQ是一个消息代理(或者说消息队列),它的主要意图很明显,就是接收和转发消息.你可以把它想象成一个邮局:当你把一封邮件放入邮箱,邮递员会帮你把邮件送到收件人的手上.在这里,RabbitMQ就好比一个邮箱.邮局或者邮递员. RabbitMQ和邮局的主要区别在于,RabbitMQ不是处理邮件,而是接收.存储和将消息以二进制的方式转

RabbitMQ指南(C#)(二)工作队列

上一节我们实现了向指定的队列发送和接收消息.这一节,我们主要讲工作队列,用于在多个消费者之间分配置实时任务. 工作队列方式主要是为了防止在执行一个耗费资源的任务时,要等待其结束才能处理其它事情.我们将任务的执行延迟,将其封装成一个消息,然后发送给一个列队.后台再运行一个程序从队列里取出消息,然后执行任务.如果有多个消费者,还可以分享任务. 对于Web应用程序来说,这样就可以使用Http的短请求来处理复杂的业务. 准备 我们发送一个字符串来代表复杂的任务,然后用Thread.Sleep()来模拟耗

RabbitMQ指南之四:路由(Routing)和直连交换机(Direct Exchange)

在上一章中,我们构建了一个简单的日志系统,我们可以把消息广播给很多的消费者.在本章中我们将增加一个特性:我们可以订阅这些信息中的一些信息.例如,我们希望只将error级别的错误存储到硬盘中,同时可以将所有级别(error.info.warning等)的日志都打印在控制台上. 1.绑定(Bindings) 在上一章中,我们已经创建了绑定关系,回顾一下代码: 1 channel.queueBind(queueName, EXCHANGE_NAME, ""); 一个绑定是一个交换器与队列之间

RabbitMQ指南之五:主题交换器(Topic Exchange)

在上一章中,我们完善了我们的日志系统,用direct交换器替换了fanout交换器,使得我们可以有选择性地接收消息.尽管如此,仍然还有限制:不能基于多个标准进行路由.在我们的日志系统中,我们可能不仅希望根据日志等级订阅日志,还希望根据日志来源订阅日志.这个概念来自于unix工具syslog,它不仅可以根据日志等级(info/warn/crit...)来路由日志,同时还可以根据设备(auth/cron/kern...)来路由日志.这将更加灵活,我们可能希望只监听来自'cron'的error级别日志

.NET文件并发与RabbitMQ(初探RabbitMQ)

本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司机们并不陌生.本文初探RabbitMQ的简单分享可能值得学习之处不怎么多,本人对于RabbitMQ的研究目前也很初级,这个月打算按照好的学习线路提高一下,欢迎新老司机留下你们的见解. 首先提到第一个简单的场景,文件并发.我先手动实现一下文件并发,引发异常,请看如下代码. 1 static void

RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaMq等,而部分数据库如Re