泽西2.28,WebSockets,Tomcat和全局应用程序InMemoryWebsocketRegistry

时间:2019-05-23 06:35:30

标签: java dependency-injection websocket jersey

我正在使用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上获得。

0 个答案:

没有答案