消息中间件RabbitMQ-主题模式(Topic)

消息中间件RabbitMQ-主题模式(Topic)

  • 主题模式(Topic)
    • 什么是主题模式
    • 创建队列与绑定
      • 1)新建一个交换器 ,类型选择topic
      • 2)点击新建的交换器topictest
      • 3)添加匹配规则,添加后列表如下:
    • 代码实现
      • 1)goods.#
      • 2)#.log
      • 3)goods.log

主题模式(Topic)

什么是主题模式

任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
消息中间件RabbitMQ-主题模式(Topic)_第1张图片
如上图所示,此类交换器使得来自不同的源头的消息可以到达一个对列,其实说的更明白一点就是模糊匹配的意思,例如:上图中红色对列的routekey为usa.#,#代表匹配任意字符,但是要想消息能到达此对列,usa.必须匹配后面的#好可以随意。
图中usa.newsusa.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,则会抛弃此消息;

创建队列与绑定

1)新建一个交换器 ,类型选择topic

消息中间件RabbitMQ-主题模式(Topic)_第2张图片

2)点击新建的交换器topictest

消息中间件RabbitMQ-主题模式(Topic)_第3张图片

3)添加匹配规则,添加后列表如下:

消息中间件RabbitMQ-主题模式(Topic)_第4张图片
说明:
1)paobu/bancheng/quancheng这些队列要先创建;
2)主题topictest绑定队列并设置Routing key;

代码实现

编写测试类方法:

1)goods.#

    @Test
    public void testSendTopic1() {
        rabbitTemplate.convertAndSend("topictest","goods.aaa","主题模式【goods.#】");
    }

输出结果:

quancheng接收到消息:主题模式【goods.#】

2)#.log

    @Test
    public void testSendTopic2() {
        rabbitTemplate.convertAndSend("topictest","article.content.log","主题模式【#.log】");
    }

输出结果:

paobu接收到消息:主题模式【#.log】

3)goods.log

    @Test
    public void testSendTopic3() {
        rabbitTemplate.convertAndSend("topictest","goods.log","主题模式【goods.log】");
    }

输出结果:

paobu接收到消息:主题模式【goods.log】
bancheng接收到消息:主题模式【goods.log】
quancheng接收到消息:主题模式【goods.log】

你可能感兴趣的:(RabbitMQ)