RabbitMQ的三种模式-----主题模式(Topic)

主题模式(Topic):

任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue

RabbitMQ的三种模式-----主题模式(Topic)_第1张图片

1:简述

如上图所示  

此类交换器使得来自不同的源头的消息可以到达一个对列,其实说的更明白一点就是模 糊匹配的意思,例如:上图中红色对列的routekey为usa.#,#代表匹配任意字符,但是 要想消息能到达此对列,usa.必须匹配后面的#好可以随意。图中usa.news usa.weather,都能找到红色队列,符号 # 匹配一个或多个词,符号 * 匹配不多不少一个 词。因此 usa.# 能够匹配到 usa.news.XXX ,但是 usa.* 只会匹配到 usa.XXX 。  注:  交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时,实际上是由你所 连接的信道,将消息路由键同交换器上绑定的列表进行比较,后路由消息。
任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的 Queue上
1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一 个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的 队列。
2.这种模式需要RouteKey,也许要提前绑定Exchange与Queue。
3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及 log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
4.“#”表示0个或若干个关键字,“”表示一个关键字。如“log.”能与“log.warn”匹配,无法 与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息 .

2:创建队列与绑定

(1):新建一个交换器,注意要与fanout模式区分开,类型选 topic,我们给这个新建的交换器取名wchtopic

RabbitMQ的三种模式-----主题模式(Topic)_第2张图片

RabbitMQ的三种模式-----主题模式(Topic)_第3张图片

(2):绑定交换器和队列,注意添加匹配规则

i:队列wchtest匹配以 wch.开头的routing key.

RabbitMQ的三种模式-----主题模式(Topic)_第4张图片

ii:队列test1匹配以 .test1结尾的routing key.

RabbitMQ的三种模式-----主题模式(Topic)_第5张图片\

iii:队列test2 匹配routing key为 test2.log的。

RabbitMQ的三种模式-----主题模式(Topic)_第6张图片

添加绑定队列后的效果如下:

RabbitMQ的三种模式-----主题模式(Topic)_第7张图片

 

3:代码实现

代码参考:https://gitee.com/WChengHe/RabbitmqDemo.git

代码中pom文件、配置文件及启动类参考上一篇:https://blog.csdn.net/qq_22596931/article/details/89329024

测试类TopicTest.java代码:

package com.wch.demo.topic;

import com.wch.demo.DemoApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class TopicTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendTopic1(){
        rabbitTemplate.convertAndSend("wchtopic","wch.key","这是wch.#规则的消息");
    }

    @Test
    public void testSendTopic2(){
        rabbitTemplate.convertAndSend("wchtopic","key.test1","这是#.test1规则的消息");
    }

    @Test
    public void testSendTopic3(){
        rabbitTemplate.convertAndSend("wchtopic","test2.log","这是test2.log规则的消息");
    }
}

运行效果:

RabbitMQ的三种模式-----主题模式(Topic)_第8张图片

源代码:https://gitee.com/WChengHe/RabbitmqDemo.git

RabbitMQ的三种模式-----主题模式(Topic)_第9张图片

你可能感兴趣的:(RabbitMQ的三种模式-----主题模式(Topic))