Netty バージョン 2.6.0.Final を使用しています。
Netty のドキュメントを正しく理解していれば、Channel で disconnect() を呼び出すと、connect() を呼び出して後で再度接続できるはずです。ただし、disconnect() を呼び出すと、SimpleChannelHandler サブクラスの channelDisconnected() と channelClosed() の両方が呼び出されます。
これをデバッグモードで開いたところ、基本的にイベントの順序は次のとおりです。
- チャンネルで disconnect() を呼び出します
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() が呼び出され、関連する部分は次のとおりです。
case CONNECTED: if (value != null) { connect(channel, future, (SocketAddress) value); } else { channel.worker.close(channel, future); } break;
したがって、値が null で状態が CONNECTED であるため、チャネルは閉じられます (ただし、hereによると、null を使用した CONNECTED は切断要求を示す必要があり、必ずしも閉じる必要はありません。
ここで何か不足していますか?チャネルが閉じられるだけの場合、disconnect() のポイントは何ですか?
これは大きな問題ではありません。必要に応じて自分の状況に合わせて新しいチャネルを作成するだけでよいのですが、最初の検査では、これがどのように機能するかを誤解していない限り、Netty のバグのように思えます。ばかげたことをしている。