如何在Helidon SE4中为每个WebSocket连接存储用户数据
Helidon SE4 WebSocket连接关联用户数据的问题与优化思路
任务背景
- 使用Helidon SE4搭建服务器,需为每个WebSocket连接绑定并存储对应的用户数据
核心问题
Helidon SE4的WebSocket机制与Jakarta WebSockets存在差异,无法直接复用Jakarta的成熟方案:
WsSession没有提供类似Jakarta中Session.getUserProperties()的方法,无法直接在会话实例上绑定用户数据- 自定义实现的
WsListener类会被所有WebSocket连接复用,无法在Listener实例中存储单连接专属的用户数据
已尝试方案及存在的问题
基于每个连接分配独立虚拟线程的思路,尝试了两种存储方案,但均存在明显缺陷:
- ThreadLocal存储方案:借助ThreadLocal保存用户数据,但如果客户端异常断开(未触发服务器端的关闭回调),无法执行
ThreadLocal.remove()操作,会引发内存泄漏问题 - ConcurrentHashMap存储方案:使用
ConcurrentHashMap以WsSession作为键来存储用户数据,但负责连接的线程需要持续等待,会造成显著的性能损耗
内容的提问来源于stack exchange,提问作者Bakuard
相关产品推荐
相关产品推荐

