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

在上述示例中,你可以用 SockJsClient 替換 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) {
		// ...
	}
}

一旦會話建立,任何有效載荷都可以傳送,並使用配置的 MessageConverter 進行序列化,如下例所示

session.send("/topic/something", "payload");

你還可以訂閱目標。subscribe 方法需要一個用於處理訂閱訊息的處理器,並返回一個 Subscription 控制代碼,你可以用它來取消訂閱。對於每條收到的訊息,處理器可以指定應將有效載荷反序列化為的目標 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 僅在不活動的情況下發送心跳,即沒有傳送其他訊息時。當使用外部代理時,這可能會帶來挑戰,因為非代理目標的訊息表示活動但實際上並未轉發到代理。在這種情況下,你可以在初始化 外部代理 時配置一個 TaskScheduler,這樣可以確保即使僅傳送非代理目標的訊息時,心跳也會轉發到代理。

當你使用 WebSocketStompClient 進行效能測試,模擬同一臺機器上的數千個客戶端時,請考慮關閉心跳,因為每個連線都排程自己的心跳任務,這對於在同一臺機器上執行的大量客戶端來說並未最佳化。

STOMP 協議還支援回執,客戶端必須新增一個 receipt 頭,伺服器在處理傳送或訂閱後會回覆一個 RECEIPT 幀。為了支援這一點,StompSession 提供了 setAutoReceipt(boolean),它會導致在每次後續傳送或訂閱事件中新增 receipt 頭。或者,你也可以手動向 StompHeaders 添加回執頭。傳送和訂閱都返回一個 Receiptable 例項,你可以用它來註冊回執成功和失敗回撥。對於此功能,你必須為客戶端配置一個 TaskScheduler 以及回執過期的時間量(預設為 15 秒)。

請注意,StompSessionHandler 本身是一個 StompFrameHandler,這使得除了處理訊息異常的 handleException 回撥和處理傳輸級別錯誤(包括 ConnectionLostException)的 handleTransportError 之外,它還可以處理 ERROR 幀。

你可以使用 WebSocketStompClientinboundMessageSizeLimitoutboundMessageSizeLimit 屬性來限制入站和出站 WebSocket 訊息的最大大小。當出站 STOMP 訊息超過限制時,它會被分割成部分幀,接收方需要重新組裝。預設情況下,出站訊息沒有大小限制。當入站 STOMP 訊息大小超過配置的限制時,會丟擲 StompConversionException。入站訊息的預設大小限制為 64KB

WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setInboundMessageSizeLimit(64 * 1024); // 64KB
stompClient.setOutboundMessageSizeLimit(64 * 1024); // 64KB
© . This site is unofficial and not affiliated with VMware.