我有一个Apache Tomcat实例,它正在提供websockets。它通常运作良好。但是,有一个问题我无法理解。
我有一个javax.websocket.Session的实例,当我去session.isOpen()时,我通常得到会话的真实状态。因此,如果它已连接,我通常会“真实”,如果客户端断开连接,我会“假”。
但是,在一个特定情况下,session.isOpen似乎在撒谎。如果我有一个客户端(比如一个基于浏览器的websocket)丢弃其互联网连接,在服务器端(在Tomcat上的Java中)我发现javax.websocket.Session.isOpen()返回“true”!!!!我为此感到困惑。
更糟糕的是:当我尝试发送到该端点时,它不会抛出异常。因此,会话不仅没有正确报告isOpen,而且假装已经执行了它的任务!
为什么会这样?如果必须发生,我怎么知道端点对象和/或其会话对象何时发生这种情况?或者是否有一些设置我可以使这些僵尸会话消失(因此当我尝试发送给他们时抛出异常..目前他们接受消息就像它们有效一样)?
注意:我使用的是Java 8,并在Apache Tomcat 8.0.14和8.0.21(最新版本)中复制了此问题。