違いがありますか? ctx.close
はctx.channel.close
のちょうど短いバージョンですか?Netty 4では、ctx.closeとctx.channel.closeの違いは何ですか?
12
A
答えて
22
パイプラインに3つのハンドラがあり、それらがすべてclose()
オペレーションをインターセプトし、その中にctx.close()
をコールしたとします。
ChannelPipeline p = ...;
p.addLast("A", new SomeHandler());
p.addLast("B", new SomeHandler());
p.addLast("C", new SomeHandler());
...
public class SomeHandler extends ChannelOutboundHandlerAdapter {
@Override
public void close(ChannelHandlerContext ctx, ChannelPromise promise) {
ctx.close(promise);
}
}
Channel.close()
はC.close()
、B.close()
、A.close()
をトリガし、次にチャネルを閉じます。ChannelPipeline.context("C").close()
は、B.close()
,A.close()
をトリガーし、チャネルを閉じます。ChannelPipeline.context("B").close()
は、A.close()
をトリガーし、チャネルを閉じます。ChannelPipeline.context("A").close()
はチャネルを閉じます。ハンドラは呼び出されません。
したがって、Channel.close()
とChannelHandlerContext.close()
を使用する必要がありますか?親指のルールは次のとおりです。
- あなたは
ChannelHandler
としたいctx.close()
を呼び出し、ハンドラ内でチャネルを閉じるを書いている場合。一般的に - あなたはハンドラ外からチャネルをクローズしている場合(例えば、あなたがI/Oスレッドではありませんバックグラウンドスレッドを持っている、とあなたがそのスレッドからの接続をクローズします。)
17
ctx.close()はChannelHandlerContextのポイントからChannelPipelineを流れ始め、ctx.channel()。close()は常にChannelPipelineの末尾から開始します。
、CTX .channel.closeを使用する必要がありますか? ctx.closeを使用すべき例を挙げることができますか? –
一般に、ChannelPipeline内の "後の" ChannelHandlerがcloseイベントを気にしないことが分かっているときは、ctx.close()を使用できます。 –
回答が更新されました。 – trustin