【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

TopicExchange与DirectExchange类似,区别在于routingKey必须是多个单词的列表,并且以 . 分割。
【举个栗子】

现在消息生产者就拥有了四个“话题”
Queue与Exchange指定BindingKey时可以使用通配符:
#:代指0个或多个单词
*:代指一个单词

现在图中的意思就是
其实与Direct 模式没有太大的改变,就是使用了通配符来简化了绑定关系
利用SpringAMQP演示TopicExchange的使用
案例架构:

实现思路如下:
并利用@RabbitListener声明Exchange、Queue、RoutingKey
在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
在publisher中编写测试方法,向itcast. topic发送消息
【1】步骤1:在consumer服务声明Exchange、Queue
在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2,
并利用@RabbitListener声明Exchange、Queue、RoutingKey
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic.queue1"),
exchange = @Exchange(name = "itcast.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 = "itcast.topic",type = ExchangeTypes.TOPIC),
key = "#.news"
))
public void listenTopicQueue2(String msg) {
System.out.println("消费者接收到topic.queue2的消息:【" + msg + "】");
}
OK直接重启项目服务

OK,查看RabbitMQ 控制台

OK, 就是它了,点进去查看详细信息

OK, 绑定关系也很清晰
再看看队列

OK,两个队列也准备好了
【消息发送】
@Test
public void testSendTopicExchange(){
//交换机名称
String exchangeName = "itcast.topic";
//消息
String message = "这是一条中国的新闻,祝福伟大的祖国";
//发送消息
rabbitTemplate.convertAndSend(exchangeName,"china.news",message);
}
直接运行这个测试

OK,消息发送成功
查看消费者那边的日志

效果很明显,两个队列都收到了,因为 china.news 同时满足了两个“条件”
改改,换成“中国天气”
@Test
public void testSendTopicExchange(){
//交换机名称
String exchangeName = "itcast.topic";
//消息
String message = "气温.............";
//发送消息
rabbitTemplate.convertAndSend(exchangeName,"china.weather",message);
}
直接运行测试,预期结果是 只有队列1 可以收到

OK,没问题
来一个美国新闻
@Test
public void testSendTopicExchange(){
//交换机名称
String exchangeName = "itcast.topic";
//消息
String message = "美国新闻.............";
//发送消息
rabbitTemplate.convertAndSend(exchangeName,"usa.news",message);
}
OK,直接运行

OK,没毛病
回顾一下


描述下Direct交换机与Topic交换机的差异?