私はNettyバージョン2.6.0.Finalを使用しています。Netty - calling channel.disconnect()は実際にチャンネルを閉じます
Nettyのドキュメントを正しく理解している場合は、チャンネルのdisconnect()を呼び出すとconnect()を呼び出して後でもう一度接続する必要があります。しかし、disconnect()を呼び出すと、私のSimpleChannelHandlerサブクラスのchannelDisconnected()とchannelClosed()の両方が呼び出されます。
私は、デバッグモードでこれを開いて、基本的にイベントの順序は次のとおりです。
- 私は私のチャンネル
Channels.disconnect(上の切断()を呼び出し)に呼び出されます:
public static ChannelFuture disconnect(Channel channel) { ChannelFuture future = future(channel); channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent( channel, future, ChannelState.CONNECTED, null)); return future; }
最終的にNioSocketPipelineSink.eventSunk()が呼び出され、関連する部分は次のようになります。
ヌルに接続hereに従って必ずしも近くない、切断要求を示すべきであるcase CONNECTED: if (value != null) { connect(channel, future, (SocketAddress) value); } else { channel.worker.close(channel, future); } break;
だから値がnullであり、状態が接続されているため、チャネルが(閉じます。
ここに何か不足していますか?チャンネルが閉じられただけではdisconnect()のポイントは何ですか?
これは大きな問題ではありません。自分の状況に合わせて新しいチャンネルを作成することができますが、最初の検査ではこれがNettyバグのようです私は愚かなことをしています。
ええ、私はそれが理にかなっていると思います。私は主に、チャンネルとパイプライン全体を完全に再作成することなく(そしてそれを参照するオブジェクトを更新することなく)Netty TCPチャンネルを切断した後で再利用できる方法を探していましたが、おそらく問題になるほど高価ではありません。 –
TCP接続は、ほとんどの場合、上位レベルで「タイト」接続を表します。ほとんどの場合、より高いレベルの接続が終了したときにそれらを単に破棄するよりも、より低いレベルのリソースを再使用しようとすると、より多くの作業と混乱が生じます。 –