javax.websocket.Session - 哪个map实现是getUserProperties()返回?

时间:2017-10-18 17:44:41

标签: java session websocket

我目前正在使用jetty进行部署,但我想每个实现都遵循同一个概念。所以它返回一个HashMap或ConcurrentHashMap或其他什么。我试图检查WebsocketSession for Jetty的实现源,但在里面我找不到用map初始化用户属性的地方。好吧,对于jetty,我可以使用调试器来检查为会话分配了哪些用户属性实例,但这并没有回答这个问题,其他应用服务器是否也会这样做。

有谁知道答案? SearchWebSites主要是在websockets上返回教程,无法得到这个特定问题的答案

1 个答案:

答案 0 :(得分:1)

Tyrus实施

至于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节所定义:

  

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

来自JSR

重点

用户属性映射仅特定于给定的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设计期间,处理用户属性时以及在处理集合时更全局:

  1. 一个会话有自己的实例或您的@ServerEndPoint
  2. NOT 假设websocket是线程安全的
  3. 仅依赖规范,不依赖于实施
  4. <子> 关于javax.websocket.session中的用户属性的辅助节点:

    <子> 请注意,userProperties仅仅是实例化的,不会从任何其他地图填充。如果您通过扩展custom Configurator使用ServerEndpointConfig.Configurator,我会强调这一点:如果您在ServerEndpointConfig.getUserProperties()中放入了一些数据,则不会自动将其复制到Session.getUserProperties()