RabbitMQ的主题模式(Topic)

什么是主题模式

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

                              

如上图所示

  • 此类交换器使得来自不同的源头的消息可以到达一个队列,其实说的更明白一点就是模糊匹配的意思。
  • 例如:上图红色队列的routeKey 为 usa.# ,#代表匹配任意字符,但是要想消息能够到达此队列, usa.必须匹配后面的#可以随意。
  • 图中 usa.news  usa.weather ,都能找到红色队列,符号 # 匹配一个或多个词 , 符号 * 匹配不多不少一个词。因为 usa.# 能够匹配到 usa.news.XXX ,但是 usa.* 只能匹配到 usa.XXX。

注:

  • 交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时,实际上是由你所连接的信道,将消息路由器同交换器上绑定的列表进行比较,最后路由消息。
  • 任何发送到 Topic Exchange 的消息都会被转发到所有关心 RouteKey 中指定话题的 Queue中。
  • 这中模式需要 RouteKey ,也许要提前绑定 Exchange 与 Queue。
  • 在进行绑定时,要提供一个该队列关心的主题,如 #.log.# 表示该队列关心所有涉及log 的消息(一个RouteKey 为 MQ.log.error 的消息会被转发到该队列)。
  • # 表示 0 个或若干个关键字,"" 表示一个关键字。如 log. 能与 log.warn 匹配,无法与 log.warn.timeout 匹配,但是 log.# 则能与上述俩者进行匹配。
  • 同样,如果Exchange 没有发现能够与 RouteKey 匹配到 Queue ,则会抛弃此消息。

1),接下来新建一个交换器 如下

              

1-2),点击新建的交换器topicTest

    

1-3),创建完成后如下图

                       

2),编写消息提供者,只发送给itcast 队列如下

    /**
     * 主题模式
     */
    @Test
    public void  sendThemeMsg(){
        rabbitTemplate.convertAndSend("topicTest","good.abc","主题模式走起");
    }

输出结果为

2-1),编写消息提供者,只发送给itheima队列如下

    /**
     * 主题模式
     */
    @Test
    public void  sendThemeMsg(){
        rabbitTemplate.convertAndSend("topicTest","abc.log","主题模式走起");
    }

输出结果为

总结

  • 如果 RouteKey 修改为 good.aaa.log 既能匹配 itcast 又能匹配 itheima
  • 如果 RouteKey 修改为 good.log 匹配 itcast , itheima 和 ittest都能匹配
发布了256 篇原创文章 · 获赞 188 · 访问量 65万+

猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/103324325