消息中间件RabbitMQ(二)

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

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();
    }
}

结果:

posted @ 2021-10-25 15:21  MicroHeart!  阅读(144)  评论(0编辑  收藏  举报