概覽
STOMP(Simple Text Oriented Messaging Protocol,簡單文字定向訊息協議)最初是為指令碼語言(如 Ruby、Python 和 Perl)連線企業訊息代理而建立的。它旨在解決一組最常用的訊息傳遞模式的最小子集。STOMP 可以透過任何可靠的雙向流網路協議使用,例如 TCP 和 WebSocket。儘管 STOMP 是一個面向文字的協議,但訊息負載可以是文字或二進位制。
STOMP 是一個基於幀的協議,其幀模仿 HTTP。以下列表顯示了 STOMP 幀的結構
COMMAND header1:value1 header2:value2 Body^@
客戶端可以使用 SEND
或 SUBSCRIBE
命令傳送或訂閱訊息,同時帶有一個 destination
標頭,該標頭描述了訊息的內容以及誰應該接收它。這啟用了一種簡單的釋出-訂閱機制,您可以使用它透過代理向其他連線的客戶端傳送訊息,或者向伺服器傳送訊息以請求執行某些工作。
當您使用 Spring 的 STOMP 支援時,Spring WebSocket 應用充當客戶端的 STOMP 代理。訊息被路由到 @Controller
訊息處理方法,或路由到一個簡單的記憶體中代理,該代理跟蹤訂閱並將訊息廣播給訂閱使用者。您還可以配置 Spring 與專用的 STOMP 代理(例如 RabbitMQ、ActiveMQ 等)一起工作,用於實際的訊息廣播。在這種情況下,Spring 維護與代理的 TCP 連線,將訊息中繼到代理,並將來自代理的訊息傳遞給連線的 WebSocket 客戶端。因此,Spring Web 應用可以依賴於統一的基於 HTTP 的安全性、通用驗證和熟悉的訊息處理程式設計模型。
以下示例展示了客戶端訂閱接收股票報價,伺服器可以定期發出這些報價(例如,透過一個定時任務,該任務透過 SimpMessagingTemplate
將訊息傳送到代理)
SUBSCRIBE id:sub-1 destination:/topic/price.stock.* ^@
以下示例展示了客戶端傳送一個交易請求,伺服器可以透過 @MessageMapping
方法處理該請求
SEND destination:/queue/trade content-type:application/json content-length:44 {"action":"BUY","ticker":"MMM","shares",44}^@
執行後,伺服器可以將交易確認訊息和詳細資訊廣播給客戶端。
在 STOMP 規範中,目標的含義有意被留白。它可以是任何字串,完全由 STOMP 伺服器定義它們支援的目標的語義和語法。然而,目標通常是路徑狀的字串,其中 /topic/..
表示釋出-訂閱(一對多),/queue/
表示點對點(一對一)訊息交換。
STOMP 伺服器可以使用 MESSAGE
命令向所有訂閱者廣播訊息。以下示例展示了伺服器向訂閱客戶端傳送股票報價
MESSAGE message-id:nxahklf6-1 subscription:sub-1 destination:/topic/price.stock.MMM {"ticker":"MMM","price":129.45}^@
伺服器不能傳送未經請求的訊息。來自伺服器的所有訊息都必須是對特定客戶端訂閱的響應,並且伺服器訊息的 subscription
標頭必須與客戶端訂閱的 id
標頭匹配。
前面的概述旨在提供對 STOMP 協議最基本的理解。我們建議完整查閱該協議的規範。