|
对于最新的稳定版本,请使用 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)这会导致receiptheader 设置为
添加到每个后续的发送或订阅事件中。
或者,您也可以手动将收据标题添加到StompHeaders.
send 和 subscribe 都返回一个实例Receiptable可用于注册收据成功和失败回调。
对于此功能,您必须使用TaskScheduler以及收据到期前的时间量(默认为 15 秒)。
请注意StompSessionHandler本身是一个StompFrameHandler,这允许
除了handleException回调
处理消息的异常和handleTransportError为
传输级错误,包括ConnectionLostException.