Topic
类型的Exchange
与Direct
相比,都是可以根据RoutingKey
把消息路由到不同的队列。 只不过Topic
类型Exchange
可以让队列在绑定BindingKey
的时候使用通配符!
BindingKey
一般都是有一个或多个单词组成,多个单词之间以.
分割,例如: item.insert
通配符规则:
#
:匹配一个或多个词
*
:匹配不多不少恰好1个词
举例:
item.#
:能够匹配item.spu.insert
或者 item.spu
item.*
:只能匹配item.spu
图示:
假如此时publisher发送的消息使用的RoutingKey
共有四种:
china.news
代表有中国的新闻消息;
china.weather
代表中国的天气消息;
japan.news
则代表日本新闻
japan.weather
代表日本的天气消息;
解释:
topic.queue1
:绑定的是china.#
,凡是以 china.
开头的routing key
都会被匹配到,包括:
china.news
china.weather
topic.queue2
:绑定的是#.news
,凡是以 .news
结尾的 routing key
都会被匹配。包括:
china.news
japan.news
接下来,我们就按照上图所示,来演示一下Topic交换机的用法。 首先,在控制台按照图示例子创建队列、交换机,并利用通配符绑定队列和交换机。
@Test
void testSendTopic1() {
String exchangeName = "test.topic";
String msg = "china.good,今天天气真不错哦!!!";
rabbitTemplate.convertAndSend(exchangeName, "china.good", msg);
}
@Test
void testSendTopic2() {
String exchangeName = "test.topic";
String msg = "123.news,今天天气真不错哦!!!";
rabbitTemplate.convertAndSend(exchangeName, "123.news", msg);
}
@Test
void testSendTopic3() {
String exchangeName = "test.topic";
String msg = "china.news,今天天气真不错哦!!!";
rabbitTemplate.convertAndSend(exchangeName, "china.news", msg);
}
@RabbitListener(queues = "topic.queue1")
public void listenTopicQueue1(String msg) throws InterruptedException {
System.out.println("消费者1 收到了 topic.queue1的消息:【" + msg +"】");
}
@RabbitListener(queues = "topic.queue2")
public void listenTopicQueue2(String msg) throws InterruptedException {
System.out.println("消费者2 收到了 topic.queue2的消息:【" + msg +"】");
}
?
Direct交换机与Topic交换机的差异?
Topic交换机接收的消息RoutingKey必须是多个单词,以
**.**
分割Topic交换机与队列绑定时的bindingKey可以指定通配符
#
:代表0个或多个词
*
:代表1个词