首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理websocket @OnError

问如何处理websocket @OnError
EN

Stack Overflow用户
提问于 2015-01-01 14:08:52
回答 2查看 15.7K关注 0票数 8

除了记录websocket错误之外,正确的处理方法是什么?

关于onError(),端点文档声明:

当web套接字会话创建某种未在web协议中建模的错误时,开发人员可能会实现此方法。例如,这可能是一个通知,表示传入的消息太大,无法处理,或者无法对传入的消息进行编码。 该方法(当前)定义了许多类别的异常来处理:

  • 连接问题,例如,可以正式关闭web套接字连接之前发生的套接字故障。它们被建模为SessionExceptions
  • 开发人员引发的运行时错误创建消息处理程序调用。
  • 在调用任何消息处理程序之前编码传入消息的转换错误。它们被建模为DecodeExceptions

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

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

到目前为止,我认为我有责任干净利落地关闭会话,并将关闭原因告知客户。这就是为什么我的onError()试图调用session.close() (如果session.isOpen()返回true ),但这导致tomcat (8.0.15)抛出一个NullPointerException

代码语言:javascript
复制
...
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似乎假定错误是致命的,并且不需要关闭会话。将记录错误,并删除会话:

代码语言:javascript
复制
@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.");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-02 07:09:18

@OnError方法调用并不意味着会话将被关闭;您可以任意操作,这取决于应用程序指定的约定。

tomcat实现中的堆栈跟踪似乎是一个bug。

ad dukeeetf2示例-似乎这段代码包含其他假设-终结点不会抛出异常,因此这里捕获的一切都来自底层WebSocket框架实现。这并不意味着存在“连接错误”;我可能会立即关闭(如果我不希望应用程序处理错误);这个实现可能导致打开连接而没有任何消息。

票数 8
EN

Stack Overflow用户

发布于 2020-11-17 19:50:26

我看到这是有点过时,但结束今天在这里寻找这一信息。根据依赖于websocket状态的方式,您需要手动关闭会话,至少对于javax.websocket实现是这样的。

在我的例子中,错误的发生给websession客户端管理实现带来了问题,所以我像上面的例子一样关闭了会话。我认为这取决于您需要什么,但是它在这个实现中肯定不会执行一个紧密的会话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27731490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档