什麼是主題模式
- 任何發送到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都能匹配