WebSocket の javax.websocket.Session の getOpenSessions は、現在開いてるセッションを全て返してくれるはずなのに、
サンプルを書いていて、どうも endpoint のセッションしか返してこない。。なぜ?
Tomcat8.5.11 で試していた。。
やりたかったのは、こんな感じ、、
@OnMessage public void onMessage(Session session, String message){ try{ session.getOpenSessions().stream().forEach(s->s.getAsyncRemote().sendText(message)); }catch(Exception e){ // TODO } }
しかたなく安全策で、、
import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/broadcast") public class BroadcastSample{ static Set<Session> sessionList = new CopyOnWriteArraySet<>(); @OnOpen public void open(Session session){ sessionList.add(session); } @OnMessage public void onMessage(Session session, String message){ try{ sessionList.stream().filter(s->s.isOpen()).forEach(s->{ s.getAsyncRemote().sendText(message); }); }catch(Exception e){ // TODO } } @OnClose public void close( Session session){ sessionList.remove(session); } @OnError public void error(Session session, Throwable cause){ } }