ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

消息中间件RabbitMQ(二)

2021-10-25 15:34:17  阅读:205  来源: 互联网

标签:false ea RabbitMQ 消息中间件 Console message consumer channel


上篇文章主要说大概逻辑,这篇就文章用代码验证细节。

1、当交换机为Direct类型,当多个相同路由key和队列连接时,发送消息时,队列是否都会收到消息? 答案是肯定的。

发送端:

using (IConnection con = conFactory.CreateConnection())//创建连接对象
{
    using (IModel channel = con.CreateModel())//创建连接会话对象
    {
        channel.QueueDeclare(queue1, false, false, false, null);
        channel.QueueDeclare(queue2, false, false, false, null);
        channel.QueueDeclare(queue3, false, false, false, null);

        channel.ExchangeDeclare(exchange1, ExchangeType.Direct);
        
        channel.QueueBind(queue1, exchange1, routingKey1);
        channel.QueueBind(queue2, exchange1, routingKey2);
        channel.QueueBind(queue3, exchange1, routingKey2);

        while (true)
        {
            Console.WriteLine("消息内容:");
            var message = Console.ReadLine();
            byte[] body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish(exchange1, routingKey2, null, body);
            channel.BasicPublish(exchange1, routingKey1, null, body);
            Console.WriteLine("成功发送消息:" + message);
        }
    }
}

消费端:

using (IConnection conn = connFactory.CreateConnection())
{
    using (IModel channel = conn.CreateModel())
    {
        var consumer = new EventingBasicConsumer(channel);
        channel.BasicConsume(queue1, false, consumer);
        channel.BasicConsume(queue2, false, consumer);
        channel.BasicConsume(queue3, false, consumer);
        consumer.Received += (model, ea) =>
        {
            byte[] message = ea.Body.ToArray();
            Console.WriteLine($"交换机:{ea.Exchange} 路由Key:{ea.RoutingKey} 接收到信息为:{Encoding.UTF8.GetString(message)}");
            channel.BasicAck(ea.DeliveryTag, false);
        };
        Console.ReadKey();
    }
}

结果:

 

2、当交换器的类型是Fanout类型,与之连接多个队列,发送消息时,是否所有与之连接的队列都会收到? 答案是肯定的。

 

发送端:

using (IConnection con = conFactory.CreateConnection())//创建连接对象
{
    using (IModel channel = con.CreateModel())//创建连接会话对象
    {
        channel.QueueDeclare(queue1, false, false, false, null);
        channel.QueueDeclare(queue2, false, false, false, null);
        channel.QueueDeclare(queue3, false, false, false, null);

        channel.ExchangeDeclare(exchange2, ExchangeType.Fanout);
        channel.QueueBind(queue1, exchange2, routingKey2);
        channel.QueueBind(queue2, exchange2, routingKey2);
        channel.QueueBind(queue3, exchange2, routingKey2);

        while (true)
        {
            Console.Write("消息内容:");
            var message = Console.ReadLine();
            byte[] body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish(exchange2, routingKey2, null, body);
            Console.WriteLine("成功发送消息:" + message);
        }
    }

消费端 代码不变。

结果:

 3、当一个队列有多个消费者,是否所有的消费者都能接收到消息? 答案是否定的。会轮询发送给监听的所有消费者

发送端:代码不变

消费端:添加一个消费者

using (IConnection conn = connFactory.CreateConnection())
{
    using (IModel channel = conn.CreateModel())
    {
        var consumer = new EventingBasicConsumer(channel);

        var consumer2=new EventingBasicConsumer(channel);
        channel.BasicConsume(queue1, false, consumer);
        channel.BasicConsume(queue2, false, consumer);
        channel.BasicConsume(queue3, false, consumer);

        channel.BasicConsume(queue1, false, consumer2);
        channel.BasicConsume(queue2, false, consumer2);
        channel.BasicConsume(queue3, false, consumer2);

        consumer.Received += (model, ea) =>
        {
            byte[] message = ea.Body.ToArray();
            Console.WriteLine($"消费者:consumer1  交换机:{ea.Exchange} 路由Key:{ea.RoutingKey} 接收到信息为:{Encoding.UTF8.GetString(message)}");
            channel.BasicAck(ea.DeliveryTag, false);
        };

        consumer2.Received += (model, ea) =>
        {
            byte[] message = ea.Body.ToArray();
            Console.WriteLine($"消费者:consumer2 交换机:{ea.Exchange} 路由Key:{ea.RoutingKey} 接收到信息为:{Encoding.UTF8.GetString(message)}");
            channel.BasicAck(ea.DeliveryTag, false);
        };

        Console.ReadKey();
    }
}

结果:

标签:false,ea,RabbitMQ,消息中间件,Console,message,consumer,channel
来源: https://www.cnblogs.com/MicroHeart/p/14688585.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有