在Jetty9中为Websockets使用带注释的POJO时的异常处理

时间:2013-06-10 21:30:34

标签: java websocket jetty

我们正在尝试使用jetty9实现基本的websocket处理。一切都按照手册完成。

@WebServlet  
public class SocketsServer extends WebSocketHandler {

@Override
public void configure(WebSocketServletFactory factory) {
    factory.getPolicy().setIdleTimeout(100000);
    factory.register(SocketClient.class);
}

@WebSocket(maxMessageSize = 64 * 1024)
public static class SocketClient {

    @OnWebSocketConnect
    public void onConnect(Session session) {
        System.out.println("Connected: " + toString());
        throw new RuntimeException("fail");
    }
}

}

请注意throw new RuntimeException("fail");行。如果在其中一个带注释的POJO方法中抛出运行时异常,则会以静默方式忽略它,并且客户端将断开连接。这可能在某种程度上对生产环境有用(可能?),但对于开发人员来说这是一种可怕的行为。所以,问题是,我们如何处理和/或记录这些方法中的所有异常?

1 个答案:

答案 0 :(得分:0)

您有关于此方案的信息,而您并未选择注意这些信息。

  1. 密切的代码和原因
  2. 任何错误
  3. 首先让我向您展示我在代码中的含义

    import org.eclipse.jetty.websocket.api.Session;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
    import org.eclipse.jetty.websocket.api.annotations.WebSocket;
    
    @WebSocket
    public class AnnotatedTextSocket
    {
        @OnWebSocketClose
        public void onClose(int statusCode, String reason)
        {
            System.out.printf("onClose(%d, %s)%n",statusCode,reason);
        }
    
        @OnWebSocketConnect
        public void onConnect(Session sess)
        {
            System.out.printf("onConnect(%s)%n",sess);
        }
    
        @OnWebSocketError
        public void onError(Throwable cause)
        {
            System.out.printf("onError(%s: %s)%n",cause.getClass().getSimpleName(),cause.getMessage());
            cause.printStackTrace(System.out);
        }
    
        @OnWebSocketMessage
        public void onText(String message)
        {
            System.out.printf("onText(%s)%n",message);
        }
    }
    

    您将注意到@OnWebSocketClose将显示本地套接字由于异常情况而关闭。

    @OnWebSocketError会告诉你导致结束的各种异常。

    注意:此通知行为也与未来JSR-356,Java WebSocket API(aka javax.websocket)在您的方案中的工作方式一致。