RabbitMQ 入门(七)SpringAMQP五种消息类型

时间:2024-10-14 22:41:47

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