将变量注入到 websocket 注释 @ServerEndpoint("/myVar")

Posted

技术标签:

【中文标题】将变量注入到 websocket 注释 @ServerEndpoint("/myVar")【英文标题】:Injection variable to websocket annotation @ServerEndpoint("/myVar") 【发布时间】:2017-07-04 14:16:50 【问题描述】:

我有聊天映射到静态 URL。我需要有机会为用户创建房间。

当应用程序已经运行时,如何在注解@ServerEndpoint("/myVariable") 中注入变量?

class SomeClass
    public void createRoom(User user) 
        String name = user.getName();
        //...Somehow inject name to annotation @ServerEndpoint("/name")...
    


@ServerEndpoint("/chat") //May be replace to @ServerEndpoint(someGetteUserName())
public class ChatEndpoint 
    @OnMessage
    public void message(String message, Session client)
            throws IOException, EncodeException 

        for (Session peer : client.getOpenSessions()) 
            peer.getBasicRemote().sendText(message);
        
    

我不使用 Spring,这是明确的 websocket 和 Glassfish。

帮我创建注解的实现变量注入。谢谢。

【问题讨论】:

【参考方案1】:

如果您只想创建和处理聊天室,我认为您不需要任何注入。您只需要通过 Java 代码独立于您的端点来处理这个问题。

我建议你:

创建一个 websocket 服务器端点:@ServerEndpoint("/chat"/client_id)。此客户端 ID pathParam 可以用作会话 ID。 在 ChatEndpoint 类中,初始化房间列表(此列表应为 static 所有线程通用)。 创建处理客户和房间的业务方法(创建/删除用户、创建/删除房间、订阅房间...等)。 最后,在您的聊天消息中尝试指定房间目的地。如果您使用 JSON 格式,这可能非常简单。

message = ... ,"room": "room1", ...

【讨论】:

感谢您的回答。我明白除了@ServerEndpoint("/chat"/client_id) 部分client_id 之外的所有内容是什么意思?这是用户请求中的参数还是路径的一部分?在您的示例中,"/chat"/client_id 路径是 "/chat",但这意味着带有括号client_id 的语法?如何在客户端注入此参数以及如何进入我的 ChatEndpoint 类? 这只是一个通过 id 来识别客户端会话的建议,这在将消息推送到特定接收者时会很有帮助。例如,第一个会话 A 想直接向另一个会话 B 发送消息(A 与 B 私下聊天)。这里 (***.com/a/21572502/3834429) 是一些有用的源代码(正面和背面):) 这种方式建议断言客户知道她的id?

以上是关于将变量注入到 websocket 注释 @ServerEndpoint("/myVar")的主要内容,如果未能解决你的问题,请参考以下文章

4.swoole学习笔记--webSocket服务器

websocket无法注入问题解决方案

Java EE 7:如何将 EJB 注入 WebSocket ServerEndpoint?

SpringBoot使用@ServerEndpoint无法依赖注入问题解决 SpringBoot webSocket配置

恶意软件将代码注入我的 Dojo/WebSocket 应用程序:如何防止?

如何将 Spring Webflux Websocket 路由作为注释?