我们正在尝试使用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方法中抛出运行时异常,则会以静默方式忽略它,并且客户端将断开连接。这可能在某种程度上对生产环境有用(可能?),但对于开发人员来说这是一种可怕的行为。所以,问题是,我们如何处理和/或记录这些方法中的所有异常?
答案 0 :(得分:0)
您有关于此方案的信息,而您并未选择注意这些信息。
首先让我向您展示我在代码中的含义
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)在您的方案中的工作方式一致。