【发布时间】:2021-05-25 05:21:32
【问题描述】:
我有一个自定义的 WebSocket 处理程序(用于自定义子协议),以通常的方式注册:
public class WSConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry
.addHandler(new PerConnectionWebSocketHandler(CustomProtocolHandler.class), endpointUrl);
}
}
在CustomProtocolHandler 内部,所有从WebSocketHandler 继承的方法(例如afterConnectionEstablished、handleMessage 等)都接收WebSocketSession,这不是线程安全的。官方教程说ConcurrentWebSocketSessionDecorator 可以用来防止并发写入,但是当我的自定义处理程序被命中时,已经太迟包装会话了。
public class CustomProtocolHandler implements WebSocketHandler, SubProtocolCapable {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) {
//This is not safe
session.sendMessage(...);
//And this this doesn't make sense
new ConcurrentWebSocketSessionDecorator(session).sendMessage(...);
}
}
现在,我看到 Spring 自己的 SubProtocolWebSocketHandler(和我的一样,实现了 WebSocketHandler 和 SubProtocolCapable)确实在内部装饰了会话,我希望我能够使用它作为基础,但是要创建SubProtocolWebSocketHandler 我需要来自spring-messaging 的MessageChannel。我既不使用 Spring Messaging,也不知道如何获得MessageChannel。我应该实现一个自定义的吗?
那么,ConcurrentWebSocketSessionDecorator 打算如何使用?我希望有一种方法可以用webSocketHandlerRegistry 注册会话包装逻辑,但不是。我唯一的想法是维护另一个ConcurrentHashMap,它将原始会话(或其ID)映射到包装器,但这太可怕了,我不需要更多状态来管理和清理。
【问题讨论】:
标签: java spring websocket spring-websocket