2015-10-19 30 views

回答

3

哇,近一年後沒有答案!我偶然發現了這個問題,同時通過getOpenSessions()在Tomcat 8上尋找一些問題的線索。對於我的問題,我最終做了以下,這也將解決這個問題。一般來說,只需要有一個靜態地圖,您可以在打開和關閉時移除:

@ServerEndpoint(value="/msg/{owner}", encoders=MessageEncoder.class, decoders=MessageEncoder.class) 
public class WebSocketListener { 
    private static final Logger logger = LoggerFactory.getLogger(WebSocketListener.class); 
    private static Map<String, Session> sessions = new HashMap<String, Session>(); 

    public WebSocketListener() { 
     System.out.println("created"); 
    } 

    @OnOpen 
    public void open(Session session, @PathParam("owner") String owner) { 
     System.out.println("open "+owner); 
     sessions.put(session.getId(), session); 
     session.getUserProperties().put("owner", owner); 
     System.out.println("open"); 
     if (session.getUserPrincipal() != null) { 
      session.getUserProperties().put("owner", owner); 
     } 
     else { 
      try { 
       session.close(new CloseReason(CloseReason.CloseCodes.CANNOT_ACCEPT, "Not authorized")); 
      } catch (IOException e) { 
      } 
     } 
    } 

    @OnClose 
    public void close(Session session) { 
     System.out.println("close"); 
     sessions.remove(session.getId()); 
    } 

    @OnError 
    public void onError(Throwable error) { 
     logger.error("",error); 
    } 

    @OnMessage 
    public void onMessage(final Session session, final Message message) { 
     System.out.println("onMessage"); 
     String owner = (String)session.getUserProperties().get("owner"); 
     Long appId = message.getAppId(); 
     for (Session s:sessions.values()) { 
      System.out.println(s); 
      if (s.isOpen() && (message.isEcho() || s != session) && owner.equals(s.getUserProperties().get("owner")) && (appId == null || appId.equals(s.getUserProperties().get("appId")))) { 
       s.getAsyncRemote().sendObject(message); 
      } 
     } 
    } 

} 
相關問題