javax.websocket.Session-getUserProperties()返回哪个映射实现?

javax.websocket.Session-getUserProperties()返回哪个映射实现?,java,session,websocket,Java,Session,Websocket,我目前正在jetty上部署,但我想每个实现都遵循一个相同的概念。那么它是返回HashMap还是ConcurrentHashMap或者其他什么。我试图检查Jetty的WebsocketSession的实现源代码,但在内部我没有找到使用映射初始化用户属性的位置。对于jetty,我可以使用调试器来检查为会话分配了哪些用户属性实例,但这并没有回答其他应用服务器是否也会这样做的问题 有人知道答案吗?搜索网站大多返回websockets上的教程,无法获得此特定问题的答案Tyrus实现 至于Tyrus,我看了

我目前正在jetty上部署,但我想每个实现都遵循一个相同的概念。那么它是返回HashMap还是ConcurrentHashMap或者其他什么。我试图检查Jetty的WebsocketSession的实现源代码,但在内部我没有找到使用映射初始化用户属性的位置。对于jetty,我可以使用调试器来检查为会话分配了哪些用户属性实例,但这并没有回答其他应用服务器是否也会这样做的问题

有人知道答案吗?搜索网站大多返回websockets上的教程,无法获得此特定问题的答案

Tyrus实现 至于Tyrus,我看了一下实现。您感兴趣的摘录是数字参考行:

87   public class TyrusSession implements Session, DistributedSession {

104      private final Map<String, Object> userProperties;

127      TyrusSession(...) {
191          userProperties = new HashMap<String, Object>();
192      }

... }
这是一个基本的HashMap。但是,您不应该依赖于实现。这就是为什么签名是由映射定义的,而不是由ConcurrentHashMap或任何复杂的东西定义的:

用户属性: 如第2.1.2节所定义:

开发人员可以使用可通过会话对象上的getUserProperties调用访问的用户属性映射,将特定于应用程序的信息与特定会话相关联。websocket实现必须保留此会话数据以供以后访问,直到端点实例上的onClose方法完成。[WSC 2.1.2-2]。在此之后,允许websocket实现丢弃开发人员数据

JSR的重点

用户属性映射只针对给定的websocket会话,因此没有并发访问的意义。您可能有另一个涉及多个会话的对象,但这将是您自己的一个对象,因此您可以决定要使用什么

一个会话=一个服务器端点实例 我想补充一点,您的服务器端点不是一个单实例:每个对等会话都应该有一个端点实例。根据JSR 359第5.1节:

除非由具有不同生命周期的JavaEE组件支持(参见第7章),否则容器必须为每个对等方使用端点的唯一实例。[WSC-5.1-1]在所有情况下,实现一次都不能调用每个对等点具有多个线程的端点实例。[WSC-5.1-2]在open方法完成之前,实现可能不会在端点上调用close方法。[WSC-5.1-3]

这保证了每个对等方每次调用websocket端点实例的容器线程不会超过一个。[WSC-5.1-4]

简而言之,在websocket设计过程中,在处理用户属性时,以及在处理集合时,更全局地:

一个会话有自己的实例或@ServerEndPoint 不要假设websocket是线程安全的 只靠规范,不靠实施 javax.websocket.session中有关用户属性的侧节点:


请注意,userProperties只是实例化的,而不是从任何其他映射填充的。在使用扩展时,我会强调这一点:如果在ServerEndpointConfig.getUserProperties中放入一些数据,它们将不会在Session.getUserProperties中自动复制。

为什么不依赖于实现?将实现隐藏在接口后面的原因是为了防止处理具体的实现。