1

基本的に次のことを行うnettyクライアントがあります。

TCP 経由でサーバーに接続した後、プログラムは以下のスニペットを呼び出します。1 回目はうまくいきますが、2 回目は次のような症状が発生します。永遠にループします。チャンネルが接続されました。channelFuture.isDone() == false。channelFuture.isSuccess()==false および channelFuture.getCause()== null。私が見ることができる例外や、問題が何であるかを理解するのに役立つ情報はありません. この問題をデバッグするための詳細情報を取得する方法はありますか?

    ChannelFuture channelFuture = null;

    while (channelFuture == null || !channelFuture.isSuccess()) {
        try {
            channelFuture = channel.write(content);
            channelFuture.await(1000);

        } catch (InterruptedException ex) {
            Logger.getGlobal().log(Level.SEVERE, "Interrupted ", ex);
        }
    }
4

1 に答える 1

4

ChannelFuture の扱い方に問題があると思います。

投稿されたコードで、ループの繰り返しで書き込みが失敗した場合、channelFuture が再割り当てされているため、ループの後続の繰り返しが開始されると (1000 ミリ秒後)、この失敗と原因は失われます。さらに、書き込みが完了するまでに 1000 ミリ秒以上かかる場合は、次の反復でキューに入れられた書き込みを追加し、channelFuture が継続的に置き換えられ、チェックする前に書き込みが 1000 ミリ秒で完了しないため、各反復がさらに遅れることになります。 channelFuture.isSuccess()。

投稿されたコードでできることは、channelFuture.await(1000)やみくもに続行して channelFuture を破棄する代わりに、の戻り値を読み取って、書き込みが成功したか失敗したかを確認することです。

ただし、理想的には、まったく使用せずChannelFuture.await()、代わりに使用ChannelFuture.addListener()して、書き込みが完了したときに実行されるリスナーを追加する必要があります。これは、Netty を使用して非同期コードを操作する正しい方法です。

于 2013-04-08T18:51:24.730 に答える