1、简介
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交换机的用法。 首先,在控制台按照图示例子创建队列、交换机,并利用通配符绑定队列和交换机。
2、设置队列

3、设置交换机

4、绑定队列

5、设置生产者
@Testvoid testSendTopic1() {String exchangeName = "test.topic";String msg = "china.good,今天天气真不错哦!!!";rabbitTemplate.convertAndSend(exchangeName, "china.good", msg);}@Testvoid testSendTopic2() {String exchangeName = "test.topic";String msg = "123.news,今天天气真不错哦!!!";rabbitTemplate.convertAndSend(exchangeName, "123.news", msg);}@Testvoid testSendTopic3() {String exchangeName = "test.topic";String msg = "china.news,今天天气真不错哦!!!";rabbitTemplate.convertAndSend(exchangeName, "china.news", msg);}
6、设置消费者
@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 +"】");}
7、测试



8、总结
Direct交换机与Topic交换机的差异?
Topic交换机接收的消息RoutingKey必须是多个单词,以
**.**分割Topic交换机与队列绑定时的bindingKey可以指定通配符
#:代表0个或多个词
*:代表1个词