0
点赞
收藏
分享

微信扫一扫

第十一章 RabbitMQ之消费者确认机制

一叶随风_c94d 2024-10-15 阅读 12

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

举报

相关推荐

0 条评论