最近,我正在学习JEE7 websocket api,然后我在最新的Tomcat服务器上运行了一个演示,但我发现注释@javax.inject.Singleton
不起作用,这里是{{1}中发布的演示代码3}}
它在glassfish4服务器上运行良好,但如果在Tomcat中运行,ChatServerEndPoint
实例将不是单例,而是每个客户端(对等体)的实例,表示@Singleton根本不起作用。
如果我想获得与在glassfish上运行相同的结果,我必须将字段的修饰符:Set<Session> userSessions
更改为:static Set<Session> userSessions
。
在Jiji_Sasidharan's blog: demo code
的第6章第1节中任何人都可以解释原因,请帮助,tks!
答案 0 :(得分:2)
@javax.inject.Singleton
是CDI (Context and Dependency Injection)的一部分。
而javax.websocket
是JSR-356努力的一部分。
有趣的是,虽然javax.websocket
的规范(第7.1.1节)说明了
需要Web EEocket实现Java EE平台的一部分 使用。支持字段,方法和构造函数注入 javax.inject.Inject注释到所有websocket端点类中,如 以及对这些类使用拦截器。
同一规范未提及对其他CDI功能的支持,例如@javax.inject.Singleton
然而,规范确实(参见第3.1.7节),对于单例端点,您将使用覆盖javax.websocket.server.ServerEndpointConfig.Configurator
的.getEndpointInstance()
并每次返回相同的端点实例。
javax.websocket
的所有非tyrus实现都支持编写规范。 (见Jetty 9.1和Tomcat)