2013-01-02 5 views
6

私はNettyバージョン2.6.0.Finalを使用しています。Netty - calling channel.disconnect()は実際にチャンネルを閉じます

Nettyのドキュメントを正しく理解している場合は、チャンネルのdisconnect()を呼び出すとconnect()を呼び出して後でもう一度接続する必要があります。しかし、disconnect()を呼び出すと、私のSimpleChannelHandlerサブクラスのchannelDisconnected()とchannelClosed()の両方が呼び出されます。

私は、デバッグモードでこれを開いて、基本的にイベントの順序は次のとおりです。

  1. 私は私のチャンネル
  2. Channels.disconnect(上の切断()を呼び出し)に呼び出されます:

    public static ChannelFuture disconnect(Channel channel) { 
        ChannelFuture future = future(channel); 
        channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent(
         channel, future, ChannelState.CONNECTED, null)); 
        return future; 
    } 
    
  3. 最終的にNioSocketPipelineSink.eventSunk()が呼び出され、関連する部分は次のようになります。

    case CONNECTED: 
         if (value != null) { 
          connect(channel, future, (SocketAddress) value); 
         } else { 
          channel.worker.close(channel, future); 
         } 
         break; 
    
    ヌルに接続hereに従って必ずしも近くない、切断要求を示すべきである

だから値がnullであり、状態が接続されているため、チャネルが(閉じます。

ここに何か不足していますか?チャンネルが閉じられただけではdisconnect()のポイントは何ですか?

これは大きな問題ではありません。自分の状況に合わせて新しいチャンネルを作成することができますが、最初の検査ではこれがNettyバグのようです私は愚かなことをしています。

答えて

7

Nettyの意図の1つは、基本的な実装であるOIO、NIOまたはAIOに関係なく、コネクションレスソケット(TCP)の場合と同じように動作する統一されたチャネル抽象化を提示することです。かなりの違いがあるので、統一されたインターフェイスは、特定の実装のいくつかの部分で少し奇妙に見えます。

TCPソケットを切断するという行為は、(少なくともJava APIの観点からは)それを閉じることを意味します。しかし、UDPソケットを切断しても、ローカルIPアドレス/ポートとリモートIPアドレス/ポートの間の関連付けを削除するだけで、それを閉じることを意味するわけではありません。

愚かなことはしていませんが、人生の間に別のリモートターゲットにUDPソケットを実際に接続する必要がない限り、OPEN/CLOSEイベントに代わって行動することをお勧めします。

EDIT:前の段落で重要な "not"を忘れてしまった。

+0

ええ、私はそれが理にかなっていると思います。私は主に、チャンネルとパイプライン全体を完全に再作成することなく(そしてそれを参照するオブジェクトを更新することなく)Netty TCPチャンネルを切断した後で再利用できる方法を探していましたが、おそらく問題になるほど高価ではありません。 –

+0

TCP接続は、ほとんどの場合、上位レベルで「タイト」接続を表します。ほとんどの場合、より高いレベルの接続が終了したときにそれらを単に破棄するよりも、より低いレベルのリソースを再使用しようとすると、より多くの作業と混乱が生じます。 –

関連する問題