如何处理websocket @OnError

时间:2015-01-01 14:08:53

标签: java tomcat websocket onerror

除了记录它之外,处理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.");
    }

2 个答案:

答案 0 :(得分:4)

@OnError方法调用并不意味着Session将被关闭;您可以随意执行任何操作,具体取决于您的应用程序指定的合同。

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

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

答案 1 :(得分:0)

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

就我而言,发生的错误导致websession客户端管理实施出现问题,因此我如上例中所示关闭了会话。 我认为这取决于您的需求,但是在此实现中,它当然不会关闭会议。