我目前正在使用jetty进行部署,但我想每个实现都遵循同一个概念。所以它返回一个HashMap或ConcurrentHashMap或其他什么。我试图检查WebsocketSession for Jetty的实现源,但在里面我找不到用map初始化用户属性的地方。好吧,对于jetty,我可以使用调试器来检查为会话分配了哪些用户属性实例,但这并没有回答这个问题,其他应用服务器是否也会这样做。
有谁知道答案? SearchWebSites主要是在websockets上返回教程,无法得到这个特定问题的答案
答案 0 :(得分:1)
至于Tyrus,我看了TyrusSession.java
实现。你感兴趣的摘录是(数字指行):
87 public class TyrusSession implements Session, DistributedSession {
104 private final Map<String, Object> userProperties;
127 TyrusSession(...) {
191 userProperties = new HashMap<String, Object>();
192 }
... }
所以这是一个基本的HashMap。但是,您应该 NOT 依赖于实施。以下是签名由Map<String, Object>
而不是ConcurrentHashMap
或任何复杂内容定义的原因:
如JSR 359的第2.1.2节所定义:
来自JSR 的开发人员可以使用可通过会话对象上的 getUserProperties()调用访问的用户属性映射,以将特定于应用程序的特定信息与特定会话相关联。 websocket实现必须保留此会话数据以供以后访问,直到端点实例上的 onClose()方法完成。 [WSC 2.1.2-2]。在此之后,允许websocket实现丢弃开发人员数据。
重点
用户属性映射仅特定于给定的websocket会话,因此没有必要进行并发访问。你可能有另一个涉及多个会话的对象但是你自己就有一个对象,所以你决定要使用什么。 我想补充说明服务器端点不是单例的事实:预计每个对等端(会话)有一个端点实例。来自 JSR 359的第5.1节 : 除非具有不同生命周期的Java EE组件支持(请参阅第7章),否则容器必须使用每个对等方的唯一端点实例。 [WSC-5.1-1]在所有情况下,实现不得一次调用每个对等体具有多个线程的端点实例。 [WSC-5.1-2]在open方法完成之前,实现可能不会在端点上调用close方法。 [WSC-5.1-3] 这保证了websocket端点实例永远不会被每个对等体一次多个容器线程调用。 [WSC-5.1-4] 简而言之,在websocket设计期间,处理用户属性时以及在处理集合时更全局: <子>
关于一个会话=一个服务器端点实例
@ServerEndPoint
javax.websocket.session
中的用户属性的辅助节点:
<子>
请注意,userProperties
仅仅是实例化的,不会从任何其他地图填充。如果您通过扩展custom Configurator使用ServerEndpointConfig.Configurator
,我会强调这一点:如果您在ServerEndpointConfig.getUserProperties()
中放入了一些数据,则不会自动将其复制到Session.getUserProperties()
中子>