除了记录websocket错误之外,正确的处理方法是什么?
关于onError(),端点文档声明:
当web套接字会话创建某种未在web协议中建模的错误时,开发人员可能会实现此方法。例如,这可能是一个通知,表示传入的消息太大,无法处理,或者无法对传入的消息进行编码。 该方法(当前)定义了许多类别的异常来处理:
是否所有这些类型的异常都是致命的,导致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这是猫虫,还是我的误解,还是两者兼而有之?
编辑: Java示例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.");
}发布于 2015-01-02 07:09:18
@OnError方法调用并不意味着会话将被关闭;您可以任意操作,这取决于应用程序指定的约定。
tomcat实现中的堆栈跟踪似乎是一个bug。
ad dukeeetf2示例-似乎这段代码包含其他假设-终结点不会抛出异常,因此这里捕获的一切都来自底层WebSocket框架实现。这并不意味着存在“连接错误”;我可能会立即关闭(如果我不希望应用程序处理错误);这个实现可能导致打开连接而没有任何消息。
发布于 2020-11-17 19:50:26
我看到这是有点过时,但结束今天在这里寻找这一信息。根据依赖于websocket状态的方式,您需要手动关闭会话,至少对于javax.websocket实现是这样的。
在我的例子中,错误的发生给websession客户端管理实现带来了问题,所以我像上面的例子一样关闭了会话。我认为这取决于您需要什么,但是它在这个实现中肯定不会执行一个紧密的会话。
https://stackoverflow.com/questions/27731490
复制相似问题