此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

STOMP 客户端

Spring 提供了 STOMP over WebSocket 客户端和 STOMP over TCP 客户端。spring-doc.cadn.net.cn

首先,您可以创建和配置WebSocketStompClient,如以下示例所示:spring-doc.cadn.net.cn

WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setMessageConverter(new StringMessageConverter());
stompClient.setTaskScheduler(taskScheduler); // for heartbeats

在前面的示例中,您可以将StandardWebSocketClientSockJsClient, 因为这也是WebSocketClient.这SockJsClient能 使用 WebSocket 或基于 HTTP 的传输作为后备。有关更多详细信息,请参阅SockJsClient.spring-doc.cadn.net.cn

接下来,您可以建立连接并为 STOMP 会话提供处理程序, 如以下示例所示:spring-doc.cadn.net.cn

String url = "ws://127.0.0.1:8080/endpoint";
StompSessionHandler sessionHandler = new MyStompSessionHandler();
stompClient.connect(url, sessionHandler);

当会话准备好使用时,会通知处理程序,如以下示例所示:spring-doc.cadn.net.cn

public class MyStompSessionHandler extends StompSessionHandlerAdapter {

	@Override
	public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
		// ...
	}
}

会话建立后,可以发送任何有效负载,并且 序列化,配置的MessageConverter,如以下示例所示:spring-doc.cadn.net.cn

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

您还可以订阅目标。这subscribe方法需要处理程序 for 订阅上的消息,并返回Subscription处理你可以的 用于取消订阅。对于每条收到的消息,处理程序可以指定目标Object有效负载应反序列化到的类型,如以下示例所示:spring-doc.cadn.net.cn

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 秒用于读取不活动,这 关闭连接)。spring-doc.cadn.net.cn

WebSocketStompClient仅在不活动的情况下发送检测信号,即当没有 发送其他消息。这在使用外部代理时可能会带来挑战 由于具有非代理目标的消息代表活动,但实际上并非如此 转发给经纪人。在这种情况下,您可以配置TaskScheduler初始化外部代理时,确保 检测信号也会转发到代理,同时只有非代理的消息 destination 被发送。spring-doc.cadn.net.cn

当您使用WebSocketStompClient用于模拟数千人的性能测试 来自同一台机器的客户端,请考虑关闭检测信号,因为每个 connection 计划自己的检测信号任务,但未针对 在同一台机器上运行的大量客户端。

STOMP 协议还支持收据,其中客户端必须添加receipt标头,服务器在发送或 订阅。为了支持这一点,该StompSession提供setAutoReceipt(boolean)这会导致receiptheader 设置为 添加到每个后续的发送或订阅事件中。 或者,您也可以手动将收据标题添加到StompHeaders. send 和 subscribe 都返回一个实例Receiptable可用于注册收据成功和失败回调。 对于此功能,您必须使用TaskScheduler以及收据到期前的时间量(默认为 15 秒)。spring-doc.cadn.net.cn

请注意StompSessionHandler本身是一个StompFrameHandler,这允许 除了handleException回调 处理消息的异常和handleTransportError为 传输级错误,包括ConnectionLostException.spring-doc.cadn.net.cn

您可以使用inboundMessageSizeLimitoutboundMessageSizeLimit属性WebSocketStompClient以限制入站和出站 WebSocket 的最大大小 消息。当出站 STOMP 消息超过限制时,它将被拆分为部分帧, 接收器必须重新组装。默认情况下,出站没有大小限制 消息。当入站 STOMP 消息大小超过配置的限制时,将StompConversionException被抛出。入站邮件的默认大小限制为64KB.spring-doc.cadn.net.cn

WebSocketClient webSocketClient = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
stompClient.setInboundMessageSizeLimit(64 * 1024); // 64KB
stompClient.setOutboundMessageSizeLimit(64 * 1024); // 64KB