Netty中ChannelOption和AttributeKey分析

  • ChannelOption

       ChannelOption 主要是用于配置netty中一些相关的参数,这些参数的key已经在ChannelOption中以静态变量的方式设置好了,可以直接拿来使用,并且配置相关的value,如果ChannelOption设置了一个不存在的key,就会以日志的形式提示错误信息,但是不会抛出异常。

    可以大概来分析下netty中使用ChannelOption

    ChannelOption的类层级关系,AbstractConstant 

    Netty中ChannelOption和AttributeKey分析

netty 中在创建ServerBootstrap 时,里面会维护一个生成好的LinkedHashMap, 来保存所有的ChannelOption及对应的值

Netty中ChannelOption和AttributeKey分析

Netty中ChannelOption和AttributeKey分析

在ServerBootstrap 中放option时,会将这个option对象,及value存放到这个LinkedHashMap当中。

在serverBootstrap 绑定到具体的端口时,init()方法当中,会去将之前的options的信息,绑定到具体channel中

Netty中ChannelOption和AttributeKey分析

Netty中ChannelOption和AttributeKey分析

Netty中ChannelOption和AttributeKey分析

获取到channel 的config 对象,

Netty中ChannelOption和AttributeKey分析

到这里就是把options中的channelOption 值 设置到config 中。

ChannelOption 类的具体实现,ChannelOption当中维护了一个 ConstantPool 对象,在ConstantPool当中,维护了一个ConcurrentHashMap对象,每创建一个ChannelOption对象,都会把这个对象,作为value放入到ConcurrentHashMap 中的value中,这里面考虑到高并发的问题,会生成一个automaticInteger作为concurrentHashMap的key,来防止死锁。

    到此就是ChannelOption相关的内容了,比较简单,可以自己走查一遍代码。

    channelOption本身并不存储设置的配置信息的值

  • AttributeKey

Netty中ChannelOption和AttributeKey分析

以上类关系图,可以看到和ChannelOption是很相似的,两个类都实现了AbstractConstrant, 同时类内部也都维护了ConstantPool ,主要维护业务数据。在特定的地方可以取出来,业务数据随着业务流转,将数据取出来,AttributeKey 大体实现上都和ChannelOption很相似。这里就不再继续赘述了。

问:Channel当中可以设置attr(),ChannelHandlerContext中也可以设置attr,两者之间有什么区别?

答:没有区别,Channel.attr() == ChannelHandlerContext.attr()

我们可以看下源码:

Netty中ChannelOption和AttributeKey分析

在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相关的内容分析了。