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)
| 归档时间: |
|
| 查看次数: |
7825 次 |
| 最近记录: |