如何处理websocket @OnError

Mal*_*alt 4 java tomcat onerror websocket

除了记录Websocket错误,正确的方法是什么?

关于onError,Endpoint 文档指出:

当Web套接字会话创建Web套接字协议中未建模的某种错误时,开发人员可以实现此方法。例如,这可能是有关传入消息太大而无法处理或传入消息无法被编码的通知。

(当前)已定义此方法处理的许多异常类别:

  • 连接问题,例如在正式关闭Web套接字连接之前发生的套接字故障。这些被建模为SessionExceptions

  • 开发人员创建的消息处理程序调用引发的运行时错误。

  • 在调用任何消息处理程序之前对传入消息进行编码的转换错误。这些被建模为DecodeExceptions

所有这些异常类型是否都是致命的,导致websocket关闭?

如果Session.close()发生错误,onError方法是否应该关闭websocket(调用)?

到目前为止,我认为完全负责关闭会话并告知客户关闭原因是我的责任。这就是为什么我onError()尝试调用session.close()是否session.isOpen()返回true的原因,但是这导致tomcat(8.0.15)抛出NullPointerException:

...
Caused by: java.lang.NullPointerException
    at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.onWritePossible(WsRemoteEndpointImplServer.java:96)
    at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:81)
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:444)
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:335)
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:264)
    at org.apache.tomcat.websocket.WsSession.sendCloseMessage(WsSession.java:536)
    at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:464)
    at org.apache.tomcat.websocket.WsSession.close(WsSession.java:441)
    at my.package.MyEndpoint.onWebSocketError(MyEndpoint.java:229)
    ... 18 more
Run Code Online (Sandbox Code Playgroud)

这是tomcat的错误,我的误解还是两者兼而有之?

编辑:似乎Java EE websocket示例dukeeetf2假定错误是致命的。并且无需关闭会话。记录错误,并删除会话:

@OnError
    public void error(Session session, Throwable t) {
        /* Remove this connection from the queue */
        queue.remove(session);
        logger.log(Level.INFO, t.toString());
        logger.log(Level.INFO, "Connection error.");
    }
Run Code Online (Sandbox Code Playgroud)

Pav*_*cek 5

@OnError方法调用并不意味着Session将关闭;您可以做任何您想做的事,这取决于您的应用程序指定的合同。

tomcat实现中的stacktrace似乎是一个错误。

ad dukeeetf2示例-此代码似乎包含其他假设-端点不会引发异常,因此此处捕获的所有内容均来自底层WebSocket框架实现。这实际上并不意味着存在“连接错误”;我可能会立即关闭(如果这是我不希望我的应用程序处理错误的方式);此实现可能导致打开的连接而没有任何消息。