Rabbitmq消息队列(五) 路由Routing

1、简介

  在以前一章中,我们可以把一个消息广播给多个接收者。在这一章中,我们会增加一个功能:接收者能够只接收订阅消息中的一个子集。

2、绑定

  在我们将交换机和队列进行绑定的时候,我们可以添加一个额外的参数:绑定建(routing_key)。绑定建的意义取决于交换机的类型,其中扇形交换机会忽略这个值。

  带绑定建的绑定的格式:

1 channel.queueBind(queueName, EXCHANGE_NAME, "black");

3、直连交换机(Direct exchange)

  我们使用的扇型交换机(fanout exchange)没有足够的灵活性,因为它能做的仅仅是广播, 而直连交换机会对绑定键(binding key)和路由键(routing key)进行精确匹配,从而确定消息该分发到哪个队列。

  

  在直连交换机中,多个绑定格式也是合法的:

  

3、通过直连交换机发送消息

1 Connection connection = factory.newConnection();
2 Channel channel = connection.createChannel();
3 
4 channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT);
5 channel.basicPublish(exchangeName, bindingKey, null, message.getBytes());
6 System.out.println("发送消息:" + message);
7 
8 channel.close();
9 connection.close();

 4、订阅接收消息

 1 Connection connection = factory.newConnection();
 2 Channel channel = connection.createChannel();
 3 
 4 channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT);
 5 String queueName = channel.queueDeclare().getQueue();       // 创建一个临时空队列
 6 channel.queueBind(queueName, exchangeName, bindingKey);           // 将交换机和队列进行绑定,告诉交换机将消息发送到我们的队列中
 7 
 8 Consumer consumer = new DefaultConsumer(channel) {
 9     @Override
10     public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
11         String message = new String(body, "UTF-8");
12 
13         System.out.println("接收到消息:" + message);
14     }
15 };
16 channel.basicConsume(queueName, true, consumer);

5、运行测试

  这样,接收方就可以接收到指定绑定key的消息了。

原文地址:https://www.cnblogs.com/origalom/p/8335721.html