8 Netty源码分析之ChannelOption与AttributeKey组件分析

第一步看源码过程分析

init方法源码付哦成
我们来看看第一段的内容

 //ChannelOption  init启动我们分析ChannelOption的作用
        final Map<ChannelOption<?>, Object> options = options0();
        synchronized (options) {
            //将我们传递的参数信息都添加到Channel里面
            setChannelOptions(channel, options, logger);
        }

好的我们看看ChannelOption的作用以及组件顾名思义,它的意思肯定是Channel的配置信息那么它到底配置了什么信息呢 ?我们接着往下看它的Doc是怎么说的然后它的类里面有若干个配置信息信息主要是一些TCP的信息:

/**
 * A {@link ChannelOption} allows to configure a {@link ChannelConfig} in a type-safe
 * way. Which {@link ChannelOption} is supported depends on the actual implementation
 * of {@link ChannelConfig} and may depend on the nature of the transport it belongs
 * to.
 *
 * @param <T>   the type of the value which is valid for the {@link ChannelOption}
 *          主要配置的是关于网络的一些TCP的设置项配置信息  T 表示的就是某一个设置对应的类型
 */

在这里插入图片描述
构造函数里面的参数,
追到它的super里面我们发现,里面提供了一个id,name,同时还有一个id 的唯一标识 同时它的操作时线程安全类型的

   /**
     * Creates a new instance.
     */
    protected AbstractConstant(int id, String name) {
        this.id = id;
        this.name = name;
        this.uniquifier = uniqueIdGenerator.getAndIncrement();
    }

同时我们好在ChannelOption 类中 发现了一个ConstantPool的常量我们看一下他作用

/**
 * A pool of {@link Constant}s.
 *
 * @param <T> the type of the constant
 *           ,T表示类型 创建管理常量池
 */

它说的很清楚,他是这个类的常量池同时我们看一下DefaultChannelConfig 这个类

 public <T> T getOption(ChannelOption<T> option) {
        if (option == null) {
            throw new NullPointerException("option");
        }

        if (option == CONNECT_TIMEOUT_MILLIS) {
            return (T) Integer.valueOf(getConnectTimeoutMillis());
        }
        if (option == MAX_MESSAGES_PER_READ) {
            return (T) Integer.valueOf(getMaxMessagesPerRead());
        }
        if (option == WRITE_SPIN_COUNT) {
            return (T) Integer.valueOf(getWriteSpinCount());
        }
        if (option == ALLOCATOR) {
            return (T) getAllocator();
        }

也就是说我们前面传的泛型 ChannelOption 这个泛型它会根据所传的类型进行判断并完成赋值操作.

我们看看AttributeKey这个类的作用

他是在什么时候出现呢?也是我们的Init方法里面

		 //AttributeKey 业务数据随着业务流程实现了.数据流转进行  也就是Bootstorp中启动的参数数据的传递
        final Map<AttributeKey<?>, Object> attrs = attrs0();
        synchronized (attrs) {
            for (Entry<AttributeKey<?>, Object> e: attrs.entrySet()) {
                @SuppressWarnings("unchecked")
                AttributeKey<Object> key = (AttributeKey<Object>) e.getKey();
                channel.attr(key).set(e.getValue());
            }
        }

AttributeKey 类型作用主要是用来传递我们的业务参数,也就相当于activiti里面的参数也就是启动的时候存进来,启动之后在某一地方可以用
如我们的例子里面一样 :
在这里插入图片描述

总结: ChannelOption 是维护了一些TCP参数的赋值,Attribute 是用来存储业务数据,相当于activiti里面的参数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值