我正在使用Jersey和WebSockets为大学生构建示例实时Web应用程序。开始:我来自Perl(Mojolicious)和C#(ASP.net Core)背景。我不是母语人士。 ;)
我知道,我需要一些更大的IPC机制(例如通过Redis的Pub-Sub,RabbitMQ等)才能获得干净的解决方案。但这是出于教学目的,所以我想采用一种简单的过程解决方案。
基本思想:对于应用程序接受的每个WebSocket请求,我都将Session
放入我的InMemoryWebsocketRegistry
中。此InMemoryWebsocketRegistry
应具有“应用程序级别”生存期。当用户通过REST-API发布新内容时,我想通过@Inject从依赖项注入系统中获取InMemoryWebsocketRegistry
实例,然后调用类似InMemoryWebsocketRegistry.broadcastMessage(String)
的名称来通知所有连接的WebSocket客户端。至少这是我在其他框架中完成工作的方式。 ;)
目前看来,Jersey(或随附的HK2依赖项注入系统)缺乏将内容@Inject注入@ServerEndpoint的能力(据我所知,这是WebSocket功能所必需的)。因此,我在如何使用 identical 对象来管理WebSocket处理程序和REST资源中的WebSocket会话时遇到麻烦。
我已经尝试了DI的Singleton-Scope。但是对于ServerEndpoint
我总是得到一个null
对象,在正常的REST资源中我得到了期望的对象。我已经读过即时范围,但将InMemoryWebsocketRegistry
这种方式添加到HK2只会给我一个例外,说“找不到org.glassfish.hk2.api.Immediate的活动上下文”。
所以现在我没主意了。有人知道如何解决这个问题吗?还是不可能?
完整的示例应用程序也可以在GitHub上获得。