今天带来topic方式进行收发消息。Topic
类型的Exchange
与Direct
相比,都是可以根据RoutingKey
把消息路由到不同的队列。只不过Topic
类型Exchange
可以让队列在绑定Routing key
的时候使用通配符!
通配符规则:
#
:匹配一个或多个词
*
:匹配不多不少恰好1个词
接收消息并且声明队列和交换机:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name="topic.queue2",durable = "false"),
exchange = @Exchange(name = "topic.exchange",durable = "false",
type = ExchangeTypes.TOPIC),
key = "#.news"
))
public void listenTopicQueue2(String msg){
System.out.println("消费者接收到topic.queue2的消息:【" + msg + "】");
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic.queue1",durable = "false"),
exchange = @Exchange(name = "topic.exchange",durable = "false",
type = ExchangeTypes.TOPIC),
key = "china.#"
))
public void listenTopicQueue1(String msg){
System.out.println("消费者接收到topic.queue1的消息:【" + msg + "】");
}
这里的声明还是两种方式,为了缩短篇幅,采用了基于注解的方式,
编写生产者代码:
@GetMapping("/topic")
public void sendMessageTopic(String msg) {
rabbitTemplate.convertAndSend("topic.exchange","china.news",msg);
}
用Postman进行测试。
得到结果:两个队列都收到了消息。(这里测试结果一直添加不上图片,以后有机会补上)
因为测试的时候发的消息和两个队列的routingkey都匹配,所以两个队列都收到了消息。