【发布时间】:2014-08-14 06:27:38
【问题描述】:
在 JSR-356 中广播服务器发起的 WebSocket 消息的最佳实践是什么?
为了澄清,我知道使用@OnMessage 注释时回复甚至广播是如何工作的,但我想从服务器发送事件而不先从客户端接收消息。换句话说,我想我需要在下面的代码中引用MessageServerEndpoint 实例。
我见过下面的解决方案,但是它使用的是静态方法,不是很优雅。
@ServerEndpoint(value = "/echo")
public class MessageServerEndpoint {
private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
sessions.remove(session);
}
// Static method - I don't like this at all
public static void broadcast(String message) {
for (Session session : sessions) {
if (session.isOpen()) {
session.getBasicRemote().sendText(message);
}
}
}
}
public class OtherClass {
void sendEvent() {
MessageServerEndpoint.broadcast("test");
// How do I get a reference to the MessageServerEndpoint instance here instead?
}
}
【问题讨论】:
-
很容易去除静电。什么不优雅?
-
抱歉,我认为我的问题不是很清楚。我不确定如何从程序的其余部分访问 MessageServerEndpoint 实例。
-
如何使用@ServerEndpoint` 注释创建一个servlet。 servlet 将处理正常的 websocket 请求,并执行您的自定义服务器驱动请求。