什么是主题模式
- 任何发送到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都能匹配