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都能匹配

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章