一、Topic Exchange(消息模式)
TopicExchange 与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并且以.分割。
Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让Queue和Exchange指定BingdingKey时可以使用通配符:
`#`:匹配一个或多个词
`*`:匹配1个单词
Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: `item.insert`
举例:
`item.#`:能够匹配`item.spu.insert` 或者 `item.spu`
`item.*`:只能匹配`item.spu`
解释:
- Queue1:绑定的是`china.#` ,因此凡是以 `china.`开头的`routing key` 都会被匹配到。包括china.news和china.weather
- Queue2:绑定的是`#.news` ,因此凡是以 `.news`结尾的 `routing key` 都会被匹配。包括china.news和japan.news
二、TopicExchange 示例
实现思路如下:
1. 并利用@RabbitListener声明Exchange、Queue、RoutingKey
2. 在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
3. 在publisher中编写测试方法,向it. topic发送消息
具体步骤:
步骤一:
1.在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
2.并利用@RabbitListener声明Exchange、Queue、RoutingKey
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic.queue1"),
exchange = @Exchange(name = "it.topic", type = ExchangeTypes.TOPIC),
key = "china.#"
))
public void listenTopicQueue1(String msg){
System.out.println("消费者接收到topic.queue1的消息:【" + msg + "】");
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic.queue2"),
exchange = @Exchange(name = "it.topic", type = ExchangeTypes.TOPIC),
key = "#.news"
))
public void listenTopicQueue2(String msg){
System.out.println("消费者接收到topic.queue2的消息:【" + msg + "】");
}
步骤二:在publisher服务发送消息到TopicExchange
1.在publisher服务中添加测试方法
/**
* topicExchange
*/
@Test
public void testSendTopicExchange() {
// 交换机名称
String exchangeName = "it.topic";
// 消息
String message = "这里是 中国新闻 !";
// 发送消息
rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
}
Topic Exchange总结:
Direct交换机与Topic交换机的差异:
- Topic交换机接收的消息RoutingKey必须是多个单词,以 **.**
分割
- Topic交换机与队列绑定时的bindingKey可以指定通配符
- #
:代表0个或多个词
- *
:代表1个词