1

tyrus websockets ClientManager connectToServer 'ハンドシェイク応答が受信されていません'

デーモン、Grizzly-kernel、Grizzly-worker スレッドを作成せずに接続を再試行するにはどうすればよいですか。Thread-1 から 4 および Grizzly-kernel と Grizzly-worker スレッドを強制終了/クリーンアップするためのセッションまたはクライアントへの呼び出しはありますか?

実行されていないか、定期的に再起動されるサーバーとの接続を確立して維持しようとする JAVA メインラインの例。


public void onClose(Session session, CloseReason closeReason) {
    latch.countDown();
}


enter code here
public static void main(String[] args) {
    while (true) {
        latch = new CountDownLatch(1);
        ClientManager client = ClientManager.createClient();
        try {
            client.connectToServer(wsListener.class, new URI("wss://<host>/ws"));
            latch.await();
        }
        catch (DeploymentException e) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                break;
            }
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }

        client = null;
            latch = null;
            //  HERE... clean up 
    }
}
4

2 に答える 2

1

client.connectToServer は Session インスタンスを返し、Session.close() を呼び出すと、クライアント ランタイムをシャットダウンする必要があります (スレッドは残りません)。

使用している Tyrus のバージョンが指定されていません (1.3.3 をお勧めします。この領域でいくつかの改善を行いました)。また、共有コンテナーのサポートに興味があるかもしれません。TYRUS-275を参照してください。それをスレッドプール構成と組み合わせることができ、生成/実行中のスレッドの数をより適切に制御できるはずです。

私たちは常に新しいユース ケースを探しています。そのため、Tyrus でより適切にサポートされるべきものがあると思われる場合は、遠慮なくJIRAで新しい拡張リクエストを作成してください。

于 2014-01-03T08:17:53.327 に答える
0

私はこれとまったく同じ動作をしました。私は多くのスレッドと同期を使用していましたが、ClientEndpoint ブロッキングの onOpen メソッドを誤って取得してしまい、ハンドシェイクがタイムアウトしました。

于 2014-03-05T08:18:48.337 に答える