zoukankan      html  css  js  c++  java
  • 消息中间件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();
        }
    }

    结果:

  • 相关阅读:
    微软认证考试考试 MCTS, MCITP, MCPD 享受9折优惠
    为程序中按钮添加Shield图标
    WinHEC 2008 China Windows 7 体验之蓝屏无罪
    我们像热爱生命一样热爱技术-洛杉矶Windows硬件工程大会
    WinHEC 之盖茨编年史期待 WinHEC 2008 China
    新年伊始 {阿猫阿狗的幸福生活系列} [一]
    通过数据库备份还原 TFS 到新服务器
    为托管应用程序添加DPI Aware支持
    轻松制作Windows Vista/Windows 7系统WIM镜像
    VSTS报表自定义之Bug重现频率报表
  • 原文地址:https://www.cnblogs.com/MicroHeart/p/14688585.html
Copyright © 2011-2022 走看看