易学笔记-RabbitMQ教程4:选择性接收消息(路由器类型为:direct)

  • RabbitMQ教程4:选择性接收消息
  1. 代码基础: 易学笔记-RabbitMQ教程3:一个消息发给所有消费者(路由器类型为:fanout)
  2. 交换器(路由器):
    1. Exchange 选择 “direct”,而不是“fanout”
    2.  channel.basicPublish(EXCHANGE_NAME,severity,第二个参数 severity 为关键字
  3. 临时队列
    1. channel.queueBind(queueName, EXCHANGE_NAME, severity); 第二个参数 severity 为关键字,该关键字和交换器的关键字一致时才会被加入队列
    2. 一个队列可以绑定一个交换器的多个关键字
  4. 新建生产者:
    package oneProductAllConsume;
    
    import com.rabbitmq.client.BuiltinExchangeType;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.Channel;
    
    public class EmitLogDirect {
    
        private static final String EXCHANGE_NAME = "direct_logs";
    
        public static void main(String[] argv) throws Exception {
            //创建连接
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("192.168.65.129");
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
            //声明路由器和路由器的类型
            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
            
            String severity = "warning";
            String message = ".........i am msg.........";
    
            //发布消息
            channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes("UTF-8"));
            System.out.println(" [x] Sent '" + severity + "':'" + message + "'");
    
            channel.close();
            connection.close();
        }
        
    }
    
    1. 发布消息绑定关键字

       String message = ".........i am msg.........";

              String severity = "warning";

              //发布消息

              channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes("UTF-8"));

  5. 新建消费者:
    package oneProductAllConsume;
    
    import com.rabbitmq.client.*;
    import java.io.IOException;
    
    public class ReceiveLogsDirect {
    
        private static final String EXCHANGE_NAME = "direct_logs";
    
        public static void main(String[] argv) throws Exception {
            //建立连接和通道
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("192.168.65.129");
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
            //声明路由器和类型
            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
            //声明队列
            String queueName = channel.queueDeclare().getQueue();
            //定义要监听的级别
            String[] severities = {"info", "warning", "error"};
            //根据绑定键绑定
            for (String severity : severities) {
                channel.queueBind(queueName, EXCHANGE_NAME, severity);
            }
            System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
    
            Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope,
                                           AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println(" [x] Received '" + envelope.getRoutingKey() + "':'" + message + "'");
                }
            };
            channel.basicConsume(queueName, true, consumer);
        }
    }
    
    1. 队列、交换器和关键字绑定

       //定义要监听的级别

              String[] severities = {"info", "warning", "error"};

              //根据绑定键绑定

              for (String severity : severities) {

                  channel.queueBind(queueName, EXCHANGE_NAME, severity);

              }

  6. 测试
    1. 发布者发布 info类型消息

       [x] Sent 'info':'.........i am msg.........'

    2. 接受者接收info类型消息

       [*] Waiting for messages. To exit press CTRL+C

       [x] Received 'info':'.........i am msg.........'

    3. 发布者发布warn类型消息

       [x] Sent 'warn':'.........i am msg.........'

    4. 接受者由于只接收这三种消息:info、warning、error,不包含:warn,所以没有接收

猜你喜欢

转载自blog.csdn.net/u011830122/article/details/83956252