在创建之前向频道添加属性

Adding an attribute to a Channel before creation

我正在寻找一种在创建之前向 Channel 添加属性的方法。

原因是我需要将 Channel 关联到某个任意对象,以便我能够从通道中获取对象(例如,在 channelActive() 方法中,我有Channel 我需要关联的对象)。

Bootstrap 公开了一个 attr() 方法,但以这种方式添加的属性可用于从此 Bootstrap 实例创建的所有频道。

此外,在创建频道后添加属性是有问题的,因为在添加属性之前可能会调用 channelActive() 方法。

通过 Bootstrap.attr(...) 添加将使该属性在 channelActive(...) 中可用,因为该属性是在调用 fireChannelActive() 之前设置的。

如果您不想使用此方法,您也可以添加一个覆盖 channelRegistered(...)ChannelInboundHandler 并自行添加属性。

对于需要它的人,这里有一个解决方案:

ChannelFuture registerFuture;
try {
    registerFuture = castBootstrap.register().await();
} catch (InterruptedException e) {
    //Handle the exception
}

final Channel channel = registerFuture.channel();
channel.attr(MY_ATTR_KEY).set(/* some value */);

ChannelFuture connectFuture = channel.connect(/* Resolved socket address */);

上面的代码不是依赖 Bootstrap 来创建 Channel,而是创建并注册 Channel,并使用 Channel 接口进行连接。