在创建之前向频道添加属性
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
接口进行连接。
我正在寻找一种在创建之前向 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
接口进行连接。