在jety9中为Websockets使用带注释的pojo时的异常处理



我们正在尝试使用jety9实现一个基本的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. 关闭代码和原因

让我从代码

开始
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)将在您的场景中工作的方式一致。

相关内容

  • 没有找到相关文章