此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
STOMP 客户端
Spring 提供了 STOMP over WebSocket 客户端和 STOMP over TCP 客户端。
首先,您可以创建和配置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) {
// ...
}
}
会话建立后,可以发送任何有效负载,并且
序列化,配置的MessageConverter
,如以下示例所示:
session.send("/topic/something", "payload");
您还可以订阅目标。这subscribe
方法需要处理程序
for 订阅上的消息,并返回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
初始化外部代理时,确保
检测信号也会转发到代理,同时只有非代理的消息
destination 被发送。
当您使用WebSocketStompClient 用于模拟数千人的性能测试
来自同一台机器的客户端,请考虑关闭检测信号,因为每个
connection 计划自己的检测信号任务,但未针对
在同一台机器上运行的大量客户端。 |
STOMP 协议还支持收据,其中客户端必须添加receipt
标头,服务器在发送或
订阅。为了支持这一点,该StompSession
提供setAutoReceipt(boolean)
这会导致receipt
header 设置为
添加到每个后续的发送或订阅事件中。
或者,您也可以手动将收据标题添加到StompHeaders
.
send 和 subscribe 都返回一个实例Receiptable
可用于注册收据成功和失败回调。
对于此功能,您必须使用TaskScheduler
以及收据到期前的时间量(默认为 15 秒)。
请注意StompSessionHandler
本身是一个StompFrameHandler
,这允许
除了handleException
回调
处理消息的异常和handleTransportError
为
传输级错误,包括ConnectionLostException
.
您可以使用inboundMessageSizeLimit
和outboundMessageSizeLimit
属性WebSocketStompClient
以限制入站和出站 WebSocket 的最大大小
消息。当出站 STOMP 消息超过限制时,它将被拆分为部分帧,
接收器必须重新组装。默认情况下,出站没有大小限制
消息。当入站 STOMP 消息大小超过配置的限制时,将StompConversionException
被抛出。入站邮件的默认大小限制为64KB
.
WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setInboundMessageSizeLimit(64 * 1024); // 64KB
stompClient.setOutboundMessageSizeLimit(64 * 1024); // 64KB