ReceiveTopicOne 匹配规则1
//声明交换器和队列
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String queueName = channel.queueDeclare().getQueue();
//路由关键字规则
String[] routingKeys = new String[]{"*.*.rabbit", "lazy.#"};
//绑定路由关键字
for (String bindingKey : routingKeys) {
channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);
}
ReceiveTopicTwo 匹配规则2
//声明交换器和队列
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String queueName = channel.queueDeclare().getQueue();
//路由关键字规则
String[] routingKeys = new String[]{"*.orange.*"};
//绑定路由关键字
for (String bindingKey : routingKeys) {
channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);
}
TopicSend 发送
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
//待发送信息
String[] routingKeys = new String[]{"quick.orange.rabbit",
"lazy.orange.elephant",
"quick.orange.fox",
"lazy.brown.fox",
"quick.brown.fox",
"quick.orange.male.rabbit",
"lazy.orange.male.rabbit"};
for (String bindingKey : routingKeys) {
channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);
}
用三个关键字来绑定,Q1绑定关键字是【.orange.】,Q2绑定关键字是【..rabbit】和【lazy.#】,然后分析会发生什么:
Q1会收到所有orange这种颜色相关的消息
Q2会收到所有rabbit这个动物相关的消息和所有速度lazy的动物的消息
分析:
生产者发送“quick.orange.rabbit”的消息,两个队列都会收到
生产者发送“lazy.orange.elephant”,两队列也都会收到。
生产者发送”quick.orange.fox”,那么只有Q1会收到。
生产者发送”lazy.brown.fox”,那么只会有Q2能收到。
生产者发送”quick.brown.fox”,那么这条消息会被丢弃,谁也收不到。
生产者发送”quick.orange.male.rabbit”,这个消息也会被丢弃,谁也收不到。
生产者发送”lazy.orange.male.rabbit”,这个消息会被Q2的【lazy.#】规则匹配上,发送到Q2队列中。
注意
交换器在匹配模式下:
如果消费者端的路由关键字只使用【#】来匹配消息,在匹配【topic】模式下,它会变成一个分发【fanout】模式,接收所有消息。
如果消费者端的路由关键字中没有【#】或者【*】,它就变成直连【direct】模式来工作。