【发布时间】:2015-02-28 03:43:27
【问题描述】:
除了记录它之外,处理 websocket 错误的正确方法是什么?
关于onError(),端点documentation 声明:
开发者可以在 web socket session 时实现这个方法 创建某种未在 Web 套接字中建模的错误 协议。例如,这可能是一个通知,一个传入的 消息太大而无法处理,或者传入的消息无法处理 被编码。
此方法存在多种异常类别 (当前)定义为处理:
连接问题,例如,在 Web 套接字连接可以正式关闭之前发生的套接字故障。这些被建模为 SessionExceptions
由开发人员创建的消息处理程序调用引发的运行时错误。
在调用任何消息处理程序之前编码传入消息的转换错误。这些被建模为 DecodeExceptions
所有这些类型的异常都是致命的,导致 websocket 关闭吗?
如果出现错误,onError()方法是否应该关闭websocket(调用Session.close())?
到目前为止,我认为我有责任彻底关闭会话,并告知客户关闭原因。这就是为什么我的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
这是一个 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.");
}
【问题讨论】:
标签: java tomcat websocket onerror