除了记录它之外,处理websocket错误的正确方法是什么?
关于onError,端点documentation声明:
开发人员可以在Web套接字会话时实现此方法 创建某种未在Web套接字中建模的错误 协议。例如,这可以是传入的通知 消息太大而无法处理,或传入消息无法处理 被编码。
此方法存在多种异常类别 (当前)定义为处理:
连接问题,例如,在正式关闭Web套接字连接之前发生的套接字故障。这些被建模为SessionExceptions
开发人员创建的消息处理程序调用抛出的运行时错误。
在调用任何消息处理程序之前编码传入消息的转换错误。这些建模为DecodeExceptions
所有这些类型的异常都是致命的,导致websocket关闭吗?
如果发生错误,onError方法是否应关闭websocket(call 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.");
}
答案 0 :(得分:4)
@OnError
方法调用并不意味着Session将被关闭;您可以随意执行任何操作,具体取决于您的应用程序指定的合同。
ad dukeeetf2示例 - 似乎此代码包含其他假设 - 端点不会抛出异常,因此此处捕获的所有内容都来自底层WebSocket框架实现。这并不意味着存在“连接错误”;我可能会立即关闭(如果这是我不应该处理错误的应用程序);此实现可能导致打开连接而没有任何消息。
答案 1 :(得分:0)
我看到这有点过时了,但今天在寻找此信息时到这里结束了。 根据您对websocket状态的依赖程度,至少对于javax.websocket实现,需要手动关闭会话。
就我而言,发生的错误导致websession客户端管理实施出现问题,因此我如上例中所示关闭了会话。 我认为这取决于您的需求,但是在此实现中,它当然不会关闭会议。