`

.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

分享到:
评论

相关推荐

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

    用.Net 6.0 RabbitMQ.Client.Dll开源库写RabbitMQ的发送和接收程序,亲测可用。 包含了接收端监听程序,和发送端发送程序。

    c# RabbitMQ封装类,连接发送接收解析都支持

    c# RabbitMQ封装类,连接发送接收解析都支持

    SpringBoot整合RabbitMQ 实现消息发送确认与消息接收确认机制 源码及教材

    SpringBoot整合RabbitMQ 实现消息发送确认与消息接收确认机制 源码及教材 可以参考博客: https://blog.csdn.net/qq_29914837/article/details/93376741

    Jmeter--RabbitMQ(解决乱码)

    gitbub上面不支持乱码,此jar包支持,如果此资源不能满足,请直接下载https://download.csdn.net/download/luozhuwang/11958429 此链接,已经包含Jmeter 3.3 可以直接使用

    利用RabbitMQ实现的聊天功能

    比例user1 和user2 两个用户之前通过建立两个信道 1.当user1发送消息的时候,user1建立发送信道队列...2.当user2发送消息的时候,user2建立发送信道队列名称为:user2_to_user1, user1建立接收信道接收消费该队列的消息

    RabbitMQ 知识全面详解(值得珍藏)

    生产者是发送消息的应用,消费者是接收消息的应用,队列是存储消息的缓存,消息则是由生产者通过RabbitMQ发送给消费者的信息。 RabbitMQ的优势在于它支持多种客户端,具有易用性、扩展性和高可用性。它还提供了丰富...

    RabbitMQ.zip

    使用.net core封装的RabbitMQ帮助类库。其中对错误日志做了死信队列处理;并且将发送、接收、辅助功能的连接上下文做了分割,防止消息互串。

    springCloud

    消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 Github:https://github.com/rabbitmq ...

    Kinect2Remote:Kinect 2 身体和手势数据的远程发射器

    Kinect2Remote 是一个 .Net 项目,它连接到新的 Kinect for Windows 传感器,处理身体和手势消息,将它们打包并通过网络发送到 RabbitMQ 服务器,在那里它们可以被任意数量的接收器查询。 它最初的构建目的是将来自...

    rabbintmq 小例子

    rabbintmq 小例子,里面包含一个发送类和一个接收类,详细用法见文章 http://blog.csdn.net/liuzhigang1237/article/details/12006281

Global site tag (gtag.js) - Google Analytics