STOMP 用戶端
Spring 提供了基於 WebSocket 的 STOMP 用戶端和基於 TCP 的 STOMP 用戶端。
首先,您可以建立和組態 WebSocketStompClient
,如下列範例所示
WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setMessageConverter(new StringMessageConverter());
stompClient.setTaskScheduler(taskScheduler); // for heartbeats
在前面的範例中,您可以將 StandardWebSocketClient
替換為 SockJsClient
,因為它也是 WebSocketClient
的一種實作。SockJsClient
可以使用 WebSocket 或基於 HTTP 的傳輸作為回退方案。如需更多詳細資訊,請參閱 SockJsClient
。
接下來,您可以建立連線並為 STOMP 會話提供處理器,如下列範例所示
String url = "ws://127.0.0.1:8080/endpoint";
StompSessionHandler sessionHandler = new MyStompSessionHandler();
stompClient.connect(url, sessionHandler);
當會話準備好使用時,處理器會收到通知,如下列範例所示
public class MyStompSessionHandler extends StompSessionHandlerAdapter {
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
// ...
}
}
一旦會話建立,即可傳送任何 payload,並使用組態的 MessageConverter
進行序列化,如下列範例所示
session.send("/topic/something", "payload");
您也可以訂閱目的地。subscribe
方法需要一個處理器來處理訂閱上的訊息,並傳回您可以取消訂閱的 Subscription
控制代碼。對於每個收到的訊息,處理器可以指定 payload 應反序列化為的目標 Object
類型,如下列範例所示
session.subscribe("/topic/something", new StompFrameHandler() {
@Override
public Type getPayloadType(StompHeaders headers) {
return String.class;
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
// ...
}
});
若要啟用 STOMP 心跳,您可以將 WebSocketStompClient
與 TaskScheduler
一起組態,並選擇性地自訂心跳間隔(寫入不活動 10 秒,這會導致傳送心跳;讀取不活動 10 秒,這會關閉連線)。
WebSocketStompClient
僅在不活動時傳送心跳,即當沒有其他訊息傳送時。當使用外部 broker 時,這可能會帶來挑戰,因為目標為非 broker 的訊息代表活動,但實際上並未轉發到 broker。在這種情況下,您可以在初始化 外部 Broker 時組態 TaskScheduler
,這可確保即使僅傳送目標為非 broker 的訊息,心跳也會轉發到 broker。
當您使用 WebSocketStompClient 進行效能測試以模擬來自同一機器的數千個用戶端時,請考慮關閉心跳,因為每個連線都會排程自己的心跳任務,而這對於在同一機器上執行大量用戶端的情況並未最佳化。 |
STOMP 協定也支援收據,用戶端必須新增 receipt
標頭,伺服器會在處理 send 或 subscribe 後以 RECEIPT 框架回應。為了支援此功能,StompSession
提供了 setAutoReceipt(boolean)
,這會導致在每個後續的 send 或 subscribe 事件中新增 receipt
標頭。或者,您也可以手動將 receipt 標頭新增到 StompHeaders
。send 和 subscribe 都會傳回 Receiptable
的實例,您可以使用它來註冊收據成功和失敗回呼。對於此功能,您必須使用 TaskScheduler
和收據過期前的時間量(預設為 15 秒)來組態用戶端。
請注意,StompSessionHandler
本身是 StompFrameHandler
,這使其除了訊息處理的例外狀況的 handleException
回呼和傳輸層級錯誤(包括 ConnectionLostException
)的 handleTransportError
之外,還可以處理 ERROR 框架。
您可以使用 WebSocketStompClient
的 inboundMessageSizeLimit
和 outboundMessageSizeLimit
屬性來限制輸入和輸出 WebSocket 訊息的最大大小。當輸出 STOMP 訊息超過限制時,它會分割成部分框架,接收器必須重新組裝這些框架。預設情況下,輸出訊息沒有大小限制。當輸入 STOMP 訊息大小超過組態的限制時,會擲回 StompConversionException
。輸入訊息的預設大小限制為 64KB
。
WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setInboundMessageSizeLimit(64 * 1024); // 64KB
stompClient.setOutboundMessageSizeLimit(64 * 1024); // 64KB