0

我们正在尝试使用 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 方法之一中引发运行时异常,它会被静默忽略,并且客户端会断开连接。这可能对生产环境有用(也许?),但对开发人员来说这是一种可怕的行为。所以,问题是,我们如何处理和/或记录这些方法中的所有异常?

4

1 回答 1

0

你有一些关于这个场景的信息,你没有选择关注。

  1. 关闭代码和原因
  2. 任何错误

让我首先向您展示我在代码中的含义

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(又名 javax.websocket)在您的场景中的工作方式一致。

于 2013-06-11T14:31:16.803 回答