此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
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) {
// ...
}
}
建立会话后,可以发送任何有效负载,并且
serialized 替换为配置的MessageConverter
,如下例所示:
session.send("/topic/something", "payload");
您还可以订阅目标。这subscribe
方法需要处理程序
,并返回一个Subscription
处理
用于取消订阅。对于收到的每条消息,处理程序可以指定目标Object
type 中,payload 应反序列化为该类型,如下例所示:
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
仅在不活动的情况下发送心跳,即当 no
发送其他消息。使用外部代理时,这可能会带来挑战
因为具有非代理目标的消息表示活动,但实际上并非
转发给代理。在这种情况下,您可以配置TaskScheduler
初始化 External Broker 时,确保
当只有带有非 broker 的消息时,heartbeat 也会转发到代理
destination 的 Destination 发送。
当您使用WebSocketStompClient 用于性能测试以模拟数千个
的客户端,请考虑关闭检测信号,因为每个
Connection 会计划自己的检测信号任务,并且未针对
在同一台计算机上运行的大量客户端。 |
STOMP 协议还支持回执,其中客户端必须添加receipt
标头,服务器在 send 或
subscribe 的 intent 请求。为了支持这一点,StompSession
提供setAutoReceipt(boolean)
这会导致receipt
header 为
在每个后续 send 或 subscribe 事件上添加。
或者,您也可以手动将收据标头添加到StompHeaders
.
send 和 subscribe 都返回一个Receiptable
可用于注册接收成功和失败回调。
对于此功能,您必须为客户端配置TaskScheduler
以及收据过期前的时间(默认为 15 秒)。
请注意,StompSessionHandler
本身是一个StompFrameHandler
,这样就可以
除了handleException
callback 的
消息处理异常和handleTransportError
为
传输级错误包括ConnectionLostException
.