1、简介
在以前一章中,我们可以把一个消息广播给多个接收者。在这一章中,我们会增加一个功能:接收者能够只接收订阅消息中的一个子集。
2、绑定
在我们将交换机和队列进行绑定的时候,我们可以添加一个额外的参数:绑定建(routing_key)。绑定建的意义取决于交换机的类型,其中扇形交换机会忽略这个值。
带绑定建的绑定的格式:
channel.queueBind(queueName, EXCHANGE_NAME, "black");
3、直连交换机(Direct exchange)
我们使用的扇型交换机(fanout exchange)没有足够的灵活性,因为它能做的仅仅是广播, 而直连交换机会对绑定键(binding key)和路由键(routing key)进行精确匹配,从而确定消息该分发到哪个队列。
在直连交换机中,多个绑定格式也是合法的:
3、通过直连交换机发送消息
Connection connection = factory.newConnection();
Channel channel = connection.createChannel(); channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT);
channel.basicPublish(exchangeName, bindingKey, null, message.getBytes());
System.out.println("发送消息:" + message); channel.close();
connection.close();
4、订阅接收消息
Connection connection = factory.newConnection();
Channel channel = connection.createChannel(); channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT);
String queueName = channel.queueDeclare().getQueue(); // 创建一个临时空队列
channel.queueBind(queueName, exchangeName, bindingKey); // 将交换机和队列进行绑定,告诉交换机将消息发送到我们的队列中 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("接收到消息:" + message);
}
};
channel.basicConsume(queueName, true, consumer);
5、运行测试
这样,接收方就可以接收到指定绑定key的消息了。