channelBound
バインド リクエストと、イベントを受け取るアップストリーム ハンドラに関する同期の問題があります。channelBound
ハンドラーがオブジェクトを使用してコールバックを処理する必要があるため、ハンドラーがイベントを受け取る前にオブジェクトをチャネルにアタッチする必要があります。以下の例。
ハンドラーの例:
public class MyClientHandler extends SimpleChannelUpstreamHandler {
@Override
public void channelBound(ChannelHandlerContext ctx, ChannelStateEvent e) {
/* Problem: This can occur while the channel attachment is still null. */
MyStatefulObject obj = e.getChannel().getAttachment();
/* Do important things with attachment. */
}
}
主な例:
ClientBootstrap bootstrap = ... //Assume this has been configured correctly.
ChannelFuture f = bootstrap.bind(new InetSocketAddress("192.168.0.15", 0));
/* It is possible the boundEvent has already been fired upstream
* by the IO thread when I get here.
*/
f.getChannel().setAttachment(new MyStatefulObject());
可能なソウルション
私はこれを回避するためのいくつかの解決策を考え出しましたが、どちらも一種の「臭い」です。
channelBound
解決策 1:添付ファイルが null でなくなるまで、コールバックでスピンまたはブロックします。I/O ワーカーを拘束するため、このソリューションは好きではありません。
解決策 2:MyClientHandler
双方向ハンドラーを作成し、ダウンストリーム コールバックで を使用して添付ファイルを取得しThreadLocal
ますbindRequested
。bindRequested
要求スレッドがイベントを起動するために使用される Netty 実装の詳細に依存しているため、私はこれが好きではありません。
解決策 1 は解決策 2 よりも許容範囲が広いことがわかりました。
最初にバインドまたは接続を要求せずにチャネル参照を取得する簡単な方法はありますか?