Обработка исключений при использовании аннотированных POJO для веб-сокетов в Jetty9

Мы пытаемся реализовать базовую обработку веб-сокетов с помощью jetty9. Все делается по мануалу.

@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 возникает исключение времени выполнения, оно молча игнорируется, и клиент отключается. Это может быть как-то полезно для производственной среды (может быть?), но это ужасное поведение для разработчика. Итак, вопрос в том, как мы можем обрабатывать и/или регистрировать все исключения в этих методах?


person Andrew Sokolov    schedule 10.06.2013    source источник


Ответы (1)


У вас есть информация об этом сценарии, на которую вы не хотите обращать внимание.

  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) будет работать в вашем сценарии.

person Joakim Erdfelt    schedule 11.06.2013
comment
Я думал, что это может быть целью метода @OnWebSocketError. Я попробовал код, который вы предоставили, но консоль сервера не показывает никаких указаний на то, что методы, кроме onConnect, вызываются. - person Andrew Sokolov; 11.06.2013
comment
Странно, так и должно быть. Я пошел дальше и открыл ошибку на странице bugs.eclipse.org/410537. - person Joakim Erdfelt; 12.06.2013