posts - 206,  comments - 26,  views - 17万
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

一、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个词

posted on   努力--坚持  阅读(18)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示