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 に答える