`

.Net下RabbitMQ的使用(2) -- 发送接收消息

 
阅读更多

在安装和配置完成RabbitMQ之后,我们就可以尝试做一个最简单的例子:发送和接收消息。

 

我们先来看客户端也就是发送者的代码:

using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace SendService
{
    class Program
    {
        static void Main(string[] args)
        {
            var factory = new ConnectionFactory();
            factory.HostName = "192.168.12.111";
            factory.Port = 5672;
            factory.UserName = "admin";
            factory.Password = "admin";

            //定义要发送的数据

            List<RequestMessage> messages = new List<RequestMessage>();
            for (int i = 0; i < 200;i++ )
            {
                RequestMessage message = new RequestMessage() { MessageId = Guid.NewGuid(), Message = "this is a 请求。" + i };
                messages.Add(message);
            }
            
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare("all.sms.message", false, false, false, null);//hello是queue的名字
                    //序列化消息对象,RabbitMQ并不支持复杂对象的序列化,所以对于自定义的类型需要自己序列化
                    foreach (var item in messages)
                    {
                        XmlSerializer xs = new XmlSerializer(typeof(RequestMessage));
                        using (MemoryStream ms = new MemoryStream())
                        {

                            xs.Serialize(ms, item);

                            byte[] bytes = ms.ToArray();

                            //指定发送的路由,通过默认的exchange直接发送到指定的队列中。

                            channel.BasicPublish("", "all.sms.message", null, bytes);
                            Console.WriteLine(" [x] Sent {0}", item.Message);
                        }
                    }
                    //var body = Encoding.UTF8.GetBytes(message);
                    //channel.BasicPublish("", "all.sms.message", null, body);//hello是routing key的名字
                     
                    Console.ReadLine();
                }
            }
        }
    }

    public class RequestMessage
    {
        public Guid MessageId { set; get; }
        public string Message { set; get; }
    }
}

 

在方法
channel.BasicPublish("", "esbtest.rmq.consoleserver", null, bytes);
中的第一个参数是需要输入一个exchange。在RabbitMQ中,所有的消息都必须要通过exchange发送到各个queue里面去。发送者发送消息,其实也就是把消息放到exchange中去。而exchange知道应该把消息放到哪里去。在这个方法中,我们没有输入exchange的名称,只是定义了一个空的echange,而在第二个参数routeKey中输入了我们目标队列的名称。RabbitMQ会帮我定义一个默认的exchange,这个exchange会把消息直接投递到
我们输入的队列中,这样服务端只需要直接去这个定义了的队列中获取消息就可以了。
服务端的代码:
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace ReceiveService
{
    class Program
    {
        static void Main(string[] args)
        {
            var factory = new ConnectionFactory();
            factory.HostName = "192.168.12.111";
            factory.Port = 5672;
            factory.UserName = "admin";
            factory.Password = "admin";
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare("all.sms.message", false, false, false, null);//hello是queue的名字
                    Console.WriteLine("Listening...");
                    //在队列上定义一个消费者
                    var consumer = new QueueingBasicConsumer(channel);
                    channel.BasicConsume("all.sms.message", true, consumer);//hello是queue的名字,这里可以理解为hello是routing key的名字。因为这个例子没有使用指定名称的exchange(实际上使用的是默认的exchange名字),所以queue的名字和routing key的名字是相同的。在第五篇文章中介绍如果使用了指定名称的exchange,queue name和routing key的关系与用法。
                    Console.WriteLine(" [*] Waiting for messages." + "To exit press CTRL+C");
                    while (true)
                    {
                        //阻塞函数,获取队列中的消息
                        var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//阻塞
                        byte[] body = ea.Body;
                        XmlSerializer xs = new XmlSerializer(typeof(RequestMessage));
                        using (MemoryStream ms = new MemoryStream(body))
                        {

                            RequestMessage message = (RequestMessage)xs.Deserialize(ms);

                            Console.WriteLine("Receive a Message, Id:" + message.MessageId + " Message:" + message.Message);

                        }
                        //Console.ReadLine();
                        //var message = Encoding.UTF8.GetString(body);
                        //Console.WriteLine(" [x] Received {0}", message);
                    }
                }
            }  
        }
    }

    public class RequestMessage
    {
        public Guid MessageId { set; get; }
        public string Message { set; get; }
    }
}
 

至此,简单的发送接收程序就可以运行了,运行RabbitMQ,然后分别运行客户端和服务端。运行结果如图:

客户端:

image

 

服务端:

server

分享到:
评论

相关推荐

    rabbitmq-dotnet-client-3.5.0

    3. 消息发布:在RabbitMQ中,消息的发送者被称为生产者。`BasicPublish`方法是发布消息的主要接口,需要指定交换机(Exchange)、路由键(Routing Key)以及实际的消息内容。交换机决定了消息如何分发,路由键则与...

    rabbitmq-server-3.8.5-window.zip

    RabbitMQ是一款开源的消息队列系统,基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统中,用于处理异步任务、解耦组件以及实现消息传递。本压缩包"rabbitmq-server-3.8.5-window.zip...

    rabbitmq-server-3.9.1 win64

    2. **性能优化**:提升了消息处理速度、内存和磁盘使用效率,使得RabbitMQ在处理大量消息时表现更佳。 3. **错误修复**:解决了之前版本中可能出现的崩溃、数据丢失或安全漏洞等问题,增强了系统的稳定性。 在安装...

    rabbitmq-dotnet-client-3.6.4-dotnet-4.6.1.rar

    2. **创建通道**:通过`IConnection`对象的`CreateModel()`方法创建一个新的通道,通道是AMQP中的工作单元,用于发送和接收消息。 3. **声明交换机和队列**:使用`channel.ExchangeDeclare()`和`channel....

    rabbitmq-server-3.8.9.zip

    **RabbitMQ 3.8.9:一个强大的消息队列系统** ...通过下载并安装 "rabbitmq-server-3.8.9.zip",用户可以在 Windows 64 位环境下轻松部署和使用这一优秀工具,为分布式系统提供关键的通信基础设施。

    rabbitmq-server-3.7.14.zip

    - **交换机(Exchange)**:交换机负责接收生产者发送的消息,并根据预定义的路由规则将其分发到相应的队列。 - **队列(Queue)**:队列是存储消息的地方,它是持久化的,可以有多个消费者同时监听。 - **绑定...

    rabbitmq-server-3.8.3_for_windows.rar

    RabbitMQ是一种广泛使用的开源消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,适用于多种编程语言。这个压缩包文件"rabbitmq-server-3.8.3_for_windows.rar"包含了RabbitMQ 3.8.3版本...

    rabbitmq_server-3.0.4.tar.gz

    RabbitMQ支持多种编程语言的客户端库,包括Java、Python、Ruby、.NET、PHP等,使得开发者可以在各种平台上方便地发送和接收消息。 6. **RabbitMQ的使用场景**: - 微服务架构中的服务间通信。 - 异步任务处理,...

    .Net使用RabbitMQ即时发消息Demo

    以上就是.NET环境下使用RabbitMQ发送即时消息的详细解释和关键知识点。开发者可以通过这个基础,进一步学习RabbitMQ的高级特性,如工作队列、发布/订阅模式、死信队列等,以适应更复杂的应用场景。

    rabbitmq-server3.7版本和otp_win64安装包

    - 生产者:使用客户端库(如 Java, Python, .NET 等)发送消息到 RabbitMQ 队列。 - 消费者:同样通过客户端库订阅队列,接收并处理消息。 - 队列与交换器:队列存储消息,交换器根据路由规则将消息分发到对应的队列...

    rabbitmq-server-generic-unix-3.7.7.tar

    生产者发送消息到交换机,交换机根据预设的路由规则将消息投递到相应的队列,消费者从队列中接收消息。 7. **AMQP协议**:AMQP定义了一种标准化的消息传递模式,确保了跨平台的兼容性和互操作性。RabbitMQ支持多个...

    rabbitmq的.net驱动

    在RabbitMQ的.NET驱动中,bin目录下可能包含已编译的客户端库,供开发者在项目中引用和使用。 通过RabbitMQ的.NET驱动,开发者可以实现以下关键知识点: - **连接管理**:建立和维护到RabbitMQ服务器的安全连接。 -...

    rabbitmq-server-windows-3.8.19.zip

    最后,RabbitMQ提供了丰富的客户端库,支持多种编程语言,如Java、Python、Ruby、.NET等,方便开发者在不同平台上使用RabbitMQ进行异步通信。 总之,RabbitMQ是一个强大且灵活的消息中间件,适用于构建可扩展、可靠...

    rabbitmq-server-windows-3.7.15.zip

    当生产者(发送者)发布消息时,消息会被存储在队列中,直到消费者(接收者)准备好处理它们。这种异步处理方式提高了系统的可伸缩性和可靠性。 3. **插件系统**:RabbitMQ允许通过插件来扩展其功能,如监控、管理...

    otp_win64_24.0.exe+rabbitmq-server-windows-3.9.2.zip

    此外,RabbitMQ支持多种编程语言的客户端库,如Python、Java、.NET等,可以方便地在应用中发送和接收消息。你可以根据项目需求选择合适的客户端库进行集成。 总之,"otp_win64_24.0.exe"和"rabbitmq-server-windows...

    C# .Net RabbitMQ消息队列发送和接收实例程序

    在本文中,我们将深入探讨如何使用C# .NET 6.0和RabbitMQ.Client....提供的压缩包文件"RabbitMQ发送接收实例.Net"应该包含示例代码,供你参考和学习。实践这些示例,你将能够更好地掌握RabbitMQ在C# .NET环境下的使用。

    rabbitmq-server-3.8.3.zip

    2. **交换机(Exchange)**:负责接收生产者发送的消息,并根据预设的路由规则将其分发到不同的队列中。 3. **队列(Queue)**:存储消息的容器,多个消费者可以同时从一个队列中获取消息,但每个消息只会被一个消费者...

    C#的Demo项目:RabbitMQ封装和使用

    总结起来,这个C# Demo项目旨在教会我们如何在.NET环境中使用RabbitMQ进行消息传递,通过封装RabbitMQ.Client库,我们可以更高效地利用交换机功能,实现不同场景下的消息路由。通过学习这个项目,开发者能够更好地...

    rabbitmq-server-2.8.5.tar.gz

    2. **发布与消费消息**:生产者使用`publish`方法发布消息到交换器,消费者通过`consume`方法订阅队列并接收消息。 3. **交换器类型**:包括Direct、Fanout、Topic和Headers四种,根据业务需求选择合适的类型进行...

Global site tag (gtag.js) - Google Analytics