一、目的地類型
在上節(jié) WebSocket的那些事(5-Spring STOMP支持之連接外部消息代理)中我們已經簡單介紹了各種目的地類型,如下圖:
這一節(jié)我們來詳細探討一下各種目的地類型的區(qū)別。
在MESSAGE
報文中請求頭destination
的格式如下:
- 發(fā)布到默認交換機的消息目的地格式為:
/queue/queue_name
。 - 發(fā)布到
amp.topic
交換機的消息目的地格式為:topic/routing_key
。 - 其它所有消息目的地格式為:
/exchange/exchange_name/routing_key
。
如果隊列名、交換機名、路由key包含了/
、%
或者非ascii
字符,這些字符將會被替換為%dd
,dd
的意思是16進制編碼。
二、Exchange類型目的地
任何exchange/queue或者exchange/routing-key的組合都可以通過前綴為/exchange
的目的地來訪問。
對于SUBSCRIBE命令,目的地格式為:/exchange/<name>[/<pattern>]
,格式說明如下:
- 在
name
交換機上創(chuàng)建一個排它,自動刪除的隊列。 - 如果
<pattern>
有指定,則以<pattern>
為路由key綁定到名稱為name
的交換機上。
對于SEND命令,目的地格式為:/exchange/<name>[/<routing-key>]
,格式說明如下:
- 通過
<routing-key>
發(fā)送消息到名稱為name
的交換機上。
備注:Exchange類型的目的地不適用于從已存在的隊列消費信息。對于每個訂閱者都會創(chuàng)建一個新的隊列,并且通過指定的路由key綁定到指定的交換機。如果要消費已存在隊列的消息,可以使用
/amq/queue
目的地。
三、Queue類型目的地
對于簡單隊列,目的地格式為/queue/<name>
。
Queue類型目的地只會把消息傳遞給最多一個訂閱者,發(fā)送的消息如果沒有消費者訂閱將會一直入隊,直到訂閱者進行消費。
- 對于SUBSCRIBE命令,該類型目的地會創(chuàng)建一個共享的名稱為
name
的隊列。 - 對于SEND命令,名稱為
name
的共享隊列會在第一次發(fā)送消息到該類型的目的地時創(chuàng)建,消息將會根據(jù)路由keyname
發(fā)送到默認交換機上。
四、AMQ Queue類型目的地
如果要發(fā)送或者訂閱不由STOMP適配器管理的已存在隊列的消息,消息目的地格式為/amq/queue/<name>
,說明如下:
- 對于SEND和SUBSCRIBE命令,不會創(chuàng)建隊列。如果隊列不能存在,使用SUBSCRIBE隊列會報錯。
- 對于SEND命令,消息會經由默認交換機直接發(fā)送已經存在的名稱為
name
的隊列上。 - 對于SUBSCRIBE命令,針對已存在的名稱為
name
的隊列訂閱會基于當前STOMP會話建立。
備注:如果沒有指定任何隊列參數(shù),隊列將會被認定持久、非排它、非自動刪除。
五、Topic類型目的地
STOMP客戶端用的最多的目的地類型就是/topic/<name>
,該類型的目的地可以路由消息到多個訂閱者,發(fā)送到Topic類型目的地的消息如果沒有訂閱者訂閱,將會被丟棄。
關于Topic類型目的地的格式說明如下:
- 對于SEND命令,消息會通過路由key
<name>
發(fā)送到amp.topic
交換機上。 - 對于SUBSCRIBE命令,首先會創(chuàng)建一個自動刪除和非持久化的隊列,然后會將該隊列通過路由key
<name>
綁定到amp.topic
交換機上。
可以通過stomp.default_topic_exchange
參數(shù)可以修改默認Topic交換機的名稱,如下:
stomp.default_topic_exchange = some.exchange
更多關于目的地類型的說明可以參考:RabbitMQ STOMP插件說明。文章來源:http://www.zghlxwxcb.cn/news/detail-716789.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-716789.html
到了這里,關于WebSocket的那些事(6- RabbitMQ STOMP目的地詳解)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!