Java 在Jetty9中为WebSocket使用带注释的POJO时的异常处理
我们正在尝试使用jetty9实现基本的websocket处理。一切都是按照手册进行的Java 在Jetty9中为WebSocket使用带注释的POJO时的异常处理,java,websocket,jetty,Java,Websocket,Jetty,我们正在尝试使用jetty9实现基本的websocket处理。一切都是按照手册进行的 @WebServlet public class SocketsServer extends WebSocketHandler { @Override public void configure(WebSocketServletFactory factory) { factory.getPolicy().setIdleTimeout(100000); factory.register(So
@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");
}
}
}
请注意,
抛出新的运行时异常(“fail”)代码>行。如果在其中一个带注释的POJO方法中引发运行时异常,它将被静默忽略,并且客户端将断开连接。这在某种程度上可能对生产环境有用(也许?),但对开发人员来说却是一种可怕的行为。因此,问题是,我们如何处理和/或记录这些方法中的所有异常?您有一些关于此场景的信息,您不愿意关注这些信息
关闭代码和原因
有错误吗
让我首先向你们展示我在代码中的意思
import org.eclipse.jetty.websocket.api.Session;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
导入org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
导入org.eclipse.jetty.websocket.api.annotations.websocket;
@网袋
公共类AnnotatedTextSocket
{
@OnWebSocketClose
public void onClose(int statusCode,字符串原因)
{
System.out.printf(“一旦关闭(%d,%s)%n)”,状态代码,原因;
}
@OnWebSocketConnect
公共连接无效(会话sess)
{
系统输出打印F(“未连接(%s)%n”,sess);
}
@OnWebSocketError
公共无效申报人(可撤销原因)
{
System.out.printf(“onError(%s:%s)%n”、cause.getClass().getSimpleName()、cause.getMessage());
原因.printStackTrace(系统输出);
}
@OnWebSocketMessage
公共void onText(字符串消息)
{
System.out.printf(“上文本(%s)%n”,消息);
}
}
您将注意到,@OnWebSocketClose
将显示本地套接字由于异常情况而关闭
而@OnWebSocketError
将向您传递导致关闭的各种异常
注意:此通知行为也与未来的JSR-356 Java WebSocket API(又名javax.WebSocket)在您的场景中的工作方式一致。我认为这可能是@OnWebSocketError
方法的目的。我尝试了您提供的代码,但是服务器控制台除了调用onConnect
之外,没有显示任何方法的指示。奇怪的是,它应该这样做。我继续往前走,在门口打开了一个窃听器