将变量注入到 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")的主要内容,如果未能解决你的问题,请参考以下文章
Java EE 7:如何将 EJB 注入 WebSocket ServerEndpoint?
SpringBoot使用@ServerEndpoint无法依赖注入问题解决 SpringBoot webSocket配置