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());
可能的灵魂
我想出了几个解决方案来解决这个问题,但它们都有种“气味”,这就是为什么我在这里询问是否有人有干净的方法来做到这一点。
解决方案1:在回调中旋转或阻塞,channelBound
直到附件不为空。我不喜欢这个解决方案,因为它占用了一个 I/O 工作者。
解决方案 2:MyClientHandler
进入双向处理程序并ThreadLocal
在bindRequested
下游回调中使用 a 获取附件。我不喜欢这样,因为它依赖于请求线程用于触发bindRequested
事件的 Netty 实现细节。
我发现解决方案 1 比解决方案 2 更容易忍受。所以如果这是我需要做的,我会的。
有没有一种简单的方法来获取通道引用而无需先请求绑定或连接?