總覽
STOMP(簡單文字導向訊息協定)最初是為腳本語言(例如 Ruby、Python 和 Perl)建立,用於連線到企業訊息 Broker。它旨在解決常用訊息模式的最小子集。STOMP 可以透過任何可靠的雙向串流網路協定使用,例如 TCP 和 WebSocket。雖然 STOMP 是一種文字導向協定,但訊息酬載可以是文字或二進位。
STOMP 是一種基於框架的協定,其框架以 HTTP 為模型。以下列表顯示了 STOMP 框架的結構
COMMAND header1:value1 header2:value2 Body^@
客户端可以使用 SEND
或 SUBSCRIBE
命令來傳送或訂閱訊息,以及描述訊息內容和接收者的 destination
標頭。這啟用了一種簡單的發布-訂閱機制,您可以使用它透過 Broker 將訊息傳送給其他連線的客户端,或將訊息傳送給伺服器以請求執行某些工作。
當您使用 Spring 的 STOMP 支援時,Spring WebSocket 應用程式充當客户端的 STOMP Broker。訊息會路由到 @Controller
訊息處理方法或簡單的記憶體內 Broker,後者會追蹤訂閱並將訊息廣播給訂閱的使用者。您也可以組態 Spring 以使用專用的 STOMP Broker(例如 RabbitMQ、ActiveMQ 等)來實際廣播訊息。在這種情況下,Spring 維護與 Broker 的 TCP 連線,將訊息中繼到 Broker,並將來自 Broker 的訊息傳遞給連線的 WebSocket 客户端。因此,Spring Web 應用程式可以依靠統一的基於 HTTP 的安全性、常見的驗證以及用於訊息處理的熟悉程式設計模型。
以下範例顯示了客户端訂閱接收股票報價,伺服器可能會定期發出股票報價(例如,透過排程任務,該任務透過 SimpMessagingTemplate
將訊息傳送給 Broker)
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 協定的最基本理解。我們建議完整檢閱協定規範。