在安装和配置完成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,然后分别运行客户端和服务端。运行结果如图:
客户端:
服务端:
相关推荐
生产者发送消息到交换机,交换机根据预设的路由规则将消息投递到相应的队列,消费者从队列中接收消息。 7. **AMQP协议**:AMQP定义了一种标准化的消息传递模式,确保了跨平台的兼容性和互操作性。RabbitMQ支持多个...
3. 消息发布:在RabbitMQ中,消息的发送者被称为生产者。`BasicPublish`方法是发布消息的主要接口,需要指定交换机(Exchange)、路由键(Routing Key)以及实际的消息内容。交换机决定了消息如何分发,路由键则与...
RabbitMQ是一款开源的消息队列系统,基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统中,用于处理异步任务、解耦组件以及实现消息传递。本压缩包"rabbitmq-server-3.8.5-window.zip...
2. **性能优化**:提升了消息处理速度、内存和磁盘使用效率,使得RabbitMQ在处理大量消息时表现更佳。 3. **错误修复**:解决了之前版本中可能出现的崩溃、数据丢失或安全漏洞等问题,增强了系统的稳定性。 在安装...
2. **创建通道**:通过`IConnection`对象的`CreateModel()`方法创建一个新的通道,通道是AMQP中的工作单元,用于发送和接收消息。 3. **声明交换机和队列**:使用`channel.ExchangeDeclare()`和`channel....
**RabbitMQ 3.8.9:一个强大的消息队列系统** ...通过下载并安装 "rabbitmq-server-3.8.9.zip",用户可以在 Windows 64 位环境下轻松部署和使用这一优秀工具,为分布式系统提供关键的通信基础设施。
- **交换机(Exchange)**:交换机负责接收生产者发送的消息,并根据预定义的路由规则将其分发到相应的队列。 - **队列(Queue)**:队列是存储消息的地方,它是持久化的,可以有多个消费者同时监听。 - **绑定...
RabbitMQ是一种广泛使用的开源消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol)协议,适用于多种编程语言。这个压缩包文件"rabbitmq-server-3.8.3_for_windows.rar"包含了RabbitMQ 3.8.3版本...
RabbitMQ支持多种编程语言的客户端库,包括Java、Python、Ruby、.NET、PHP等,使得开发者可以在各种平台上方便地发送和接收消息。 6. **RabbitMQ的使用场景**: - 微服务架构中的服务间通信。 - 异步任务处理,...
以上就是.NET环境下使用RabbitMQ发送即时消息的详细解释和关键知识点。开发者可以通过这个基础,进一步学习RabbitMQ的高级特性,如工作队列、发布/订阅模式、死信队列等,以适应更复杂的应用场景。
- 生产者:使用客户端库(如 Java, Python, .NET 等)发送消息到 RabbitMQ 队列。 - 消费者:同样通过客户端库订阅队列,接收并处理消息。 - 队列与交换器:队列存储消息,交换器根据路由规则将消息分发到对应的队列...
在RabbitMQ的.NET驱动中,bin目录下可能包含已编译的客户端库,供开发者在项目中引用和使用。 通过RabbitMQ的.NET驱动,开发者可以实现以下关键知识点: - **连接管理**:建立和维护到RabbitMQ服务器的安全连接。 -...
最后,RabbitMQ提供了丰富的客户端库,支持多种编程语言,如Java、Python、Ruby、.NET等,方便开发者在不同平台上使用RabbitMQ进行异步通信。 总之,RabbitMQ是一个强大且灵活的消息中间件,适用于构建可扩展、可靠...
当生产者(发送者)发布消息时,消息会被存储在队列中,直到消费者(接收者)准备好处理它们。这种异步处理方式提高了系统的可伸缩性和可靠性。 3. **插件系统**:RabbitMQ允许通过插件来扩展其功能,如监控、管理...
此外,RabbitMQ支持多种编程语言的客户端库,如Python、Java、.NET等,可以方便地在应用中发送和接收消息。你可以根据项目需求选择合适的客户端库进行集成。 总之,"otp_win64_24.0.exe"和"rabbitmq-server-windows...
在本文中,我们将深入探讨如何使用C# .NET 6.0和RabbitMQ.Client....提供的压缩包文件"RabbitMQ发送接收实例.Net"应该包含示例代码,供你参考和学习。实践这些示例,你将能够更好地掌握RabbitMQ在C# .NET环境下的使用。
2. **交换机(Exchange)**:负责接收生产者发送的消息,并根据预设的路由规则将其分发到不同的队列中。 3. **队列(Queue)**:存储消息的容器,多个消费者可以同时从一个队列中获取消息,但每个消息只会被一个消费者...
2. **发布与消费消息**:生产者使用`publish`方法发布消息到交换器,消费者通过`consume`方法订阅队列并接收消息。 3. **交换器类型**:包括Direct、Fanout、Topic和Headers四种,根据业务需求选择合适的类型进行...
总结起来,这个C# Demo项目旨在教会我们如何在.NET环境中使用RabbitMQ进行消息传递,通过封装RabbitMQ.Client库,我们可以更高效地利用交换机功能,实现不同场景下的消息路由。通过学习这个项目,开发者能够更好地...