読者です 読者をやめる 読者になる 読者になる

WebSocket の getOpenSessions は現在開いてるのを返す約束なのに。。

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){
   }
}