Netty中ChannelOption和AttributeKey分析
- ChannelOption
ChannelOption 主要是用于配置netty中一些相关的参数,这些参数的key已经在ChannelOption中以静态变量的方式设置好了,可以直接拿来使用,并且配置相关的value,如果ChannelOption设置了一个不存在的key,就会以日志的形式提示错误信息,但是不会抛出异常。
可以大概来分析下netty中使用ChannelOption
ChannelOption的类层级关系,AbstractConstant
netty 中在创建ServerBootstrap 时,里面会维护一个生成好的LinkedHashMap, 来保存所有的ChannelOption及对应的值
在ServerBootstrap 中放option时,会将这个option对象,及value存放到这个LinkedHashMap当中。
在serverBootstrap 绑定到具体的端口时,init()方法当中,会去将之前的options的信息,绑定到具体channel中
获取到channel 的config 对象,
到这里就是把options中的channelOption 值 设置到config 中。
ChannelOption 类的具体实现,ChannelOption当中维护了一个 ConstantPool 对象,在ConstantPool当中,维护了一个ConcurrentHashMap对象,每创建一个ChannelOption对象,都会把这个对象,作为value放入到ConcurrentHashMap 中的value中,这里面考虑到高并发的问题,会生成一个automaticInteger作为concurrentHashMap的key,来防止死锁。
到此就是ChannelOption相关的内容了,比较简单,可以自己走查一遍代码。
channelOption本身并不存储设置的配置信息的值
- AttributeKey
以上类关系图,可以看到和ChannelOption是很相似的,两个类都实现了AbstractConstrant, 同时类内部也都维护了ConstantPool ,主要维护业务数据。在特定的地方可以取出来,业务数据随着业务流转,将数据取出来,AttributeKey 大体实现上都和ChannelOption很相似。这里就不再继续赘述了。
问:Channel当中可以设置attr(),ChannelHandlerContext中也可以设置attr,两者之间有什么区别?
答:没有区别,Channel.attr() == ChannelHandlerContext.attr()
我们可以看下源码:
在ChannelHandlerContext 当中,直接调用的就是其对应的Channel的 attr方法。所以两者之间没有差别。
对比Attribute ,AttributeKey, AttributeMap
Attribute 中维护了 AttributeKey 对象作为key,以及一个T类型的value, 实现Attribute接口的方法也必须是线程安全的。
AttributeMap 接口当中只提供了 attr() ,也就是 AttributeKey 对象,以及是否存在 attributeKey 的方法。
Channel对象是继承自AttributeMap 对象,所以channel.attr().set(value) 实际上就是通过attributeMap当中的attr获取到Attribute对象,然后再set值进去。
好了,到此就是 ChannelOption 和AttributeKey相关的内容分析了。