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


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值