2016-07-08 23 views
2

我的工作我的第一個WebSocket的應用程序,並感到驚訝時,這樣的代碼沒有工作始終:Tomcat 8 getOpenSessions()不返回所有會話的終點?

@ServerEndpoint(value="/msg/{owner}", encoders=MessageEncoder.class, decoders=MessageEncoder.class) 
public class WebSocketListener { 

    public WebSocketListener() { 
    } 

    @OnOpen 
    public void open(Session session, @PathParam("owner") String owner) { 
     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) { 
    } 

    @OnError 
    public void onError(Throwable error) { 
    } 

    @OnMessage 
    public void onMessage(final Session session, final Message message) { 
     String owner = (String)session.getUserProperties().get("owner"); 
     for (Session s:session.getOpenSessions() { 
      System.out.println(s); 
      if (s.isOpen() && owner.equals(s.getUserProperties().get("owner"))) { 
       s.getAsyncRemote().sendObject(message); 
      } 
     } 
    } 

} 

我從兩個客戶端和相同的「所有者」連接到這個終點時觀察,有時候兩個會話都是從getOpenSession()返回的,但是更多的情況是返回該用戶的會話,如System.out.println所證明的那樣。我的解決方法是通過向此類添加靜態映射來禁用getOpenSessions,將該會話添加到使用所有者作爲鍵的列表中,然後使用它。但是,這是一個已知的錯誤,我找不到任何抱怨這個從搜索?

+1

嗨,你有沒有想過這個?我有同樣的問題,tomcat 8.0.36,Centos7。 getOpenSessions只返回用戶會話。雖然當我在我的本地主機上測試它時,它工作正常,雖然它是稍微早些的tomcat8服務器運行徹底的日食。這兩種設置之間的另一個不同之處在於,我已經從.war文件中排除了websocket和javaee-api jar,但我認爲這不應該有所作爲 – kujosHeist

回答