我们正在尝试使用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方法中抛出一个运行时异常,它将被静默地忽略,并且客户机将断开连接。这可能在某种程度上对生产环境有用(也许?),但对于开发人员来说,这是一种可怕的行为。问题是,我们如何处理和/或记录这些方法中的所有异常?
你有一些关于这个场景的信息,你没有选择去关注。
- 关闭代码和原因
让我从代码
开始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)将在您的场景中工作的方式一致。