Spring STOMP-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,因为SockJsClient也是WebSocketClient的实现。SockJsClient可以使用WebSocket或HTTP作为后备传输。有关更多详细信息,请参见[SockJsClient](<https://docs.spring.io/spring-framework/reference/web/websocket/fallback.html#websocket-fallback-sockjs-client>)

接下来,你可以建立连接并为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) {
		*// ...*
	}
}

一旦会话建立,任何payload都可以通过配置的MessageConverter序列化后发出,如下所示:

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

你还可以订阅destinations。subscribe方法需要一个用于订阅上的消息处理器,并返回一个Subscription句柄,你可以使用它来取消订阅。对于每个接收到的消息,处理器可以指定目标的Object类型,以将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仅在不活跃时发送心跳,即当没有发送其他消息时。这在使用外部代理时可能会带来挑战,因为带有非代理destination 的消息代表活动,但实际并未转发到代理。在这种情况下,你可以在初始化外部代理时配置一个TaskScheduler,确保即使只发送带有非代理destination 的消息,心跳也会被转发到代理。

当你使用 WebSocketStompClient 进行性能测试以模拟同一台计算机上的数千个客户端时,请考虑关闭心跳,因为每个连接都会安排自己的心跳任务,并且对于在同一台计算机上运行的大量客户端而言,这并未进行优化。

STOMP协议还支持收据,客户端必须添加一个receipt 标头,服务器在处理完发送或订阅后,会响应RECEIPT帧。为此,StompSession提供了setAutoReceipt(boolean) 配置,它会在每个后续的发送或订阅事件上添加一个receipt头部。或者,你也可以手动向StompHeaders添加一个receipt 标头。发送和订阅方法都返回一个Receiptable实例,你可以使用它来注册收据成功和失败的回调。为此功能,你必须这客户端配置TaskScheduler,以及收据过期前的时间(默认为15秒)。

请注意,StompSessionHandler本身是一个 StompFrameHandler,除了用于消息处理异常的handleException回调和用于传输级错误(包括 ConnectionLostException)的handleTransportError之外,它还可以处理 ERROR 帧。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昂的数字之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值