Netty通道的容器属性Attribute详解

 更新时间:2023年12月13日 09:35:05   作者:得过且过的勇者y  
这篇文章主要介绍了Netty通道的容器属性Attribute详解,Netty中的Channel通道类,有类似于Map的容器功能,可以通过键值对的形式来保存任何Java Object的值,一般来说可以存放一些与通道实例相关联的属性,比如说服务期端的ServerSession会话实例,需要的朋友可以参考下

Netty通道的容器属性Attribute详解

Netty中的Channel通道类,有类似于Map的容器功能,可以通过“key-value”键值对的形式来保存任何Java Object的值。一般来说可以存放一些与通道实例相关联的属性,比如说服务期端的ServerSession会话实例。

Netty对此的实现其实并没有依赖Map接口,而是定义了一个类似的接口叫做AttributeMap。它有一个方法<T> Attribute<T>attr(AttributeKey<T> key),此方法接收一个AttributeKey类型的key,返回一个Attribute类型的值,即根据key获取value。这里的AttributeKey不是原始的key,而是一个key的包装类。AttributeKey确保了key的唯一性,在单个Netty应用中,key值必须唯一。而Attribute也不是原始的value,而是value的包装类。原始的value值就放置在Attribute包装类中,可以通过Attribute包装类实现value的读取(get)和设置(set),取值和设置值。这个方法永远不会返回null,但可能会返回一个尚未设置值的Attribute。

AttributeMap只是一个接口,Netty提供了默认的实现DefaultAttributeMap(Channel通道类就是继承了这个类)。这个类维护了一个DefaultAttribute(继承自AtomicReference类,用来保存value值,此外还维护了AttributeKey属性和DefaultAttributeMap属性)类型的数组变量attributes,提供了对attr方法的实现。对于传入的AttributeKey会在attributes中二分查找是否存在,如果不存在则将有序插入(根据key的id值,默认后插入的id要大)。

AttributeMap的实现要求是线程安全的,所以在DefaultAttributeMap中的实现都采用拷贝副本的方式。可以通过AttributeMap的attr方法,根据key取得Attribute类型的value,然后根据value实例完成最终的两个重要操作:设置(set)和取值(get)。

使用方式:

// 定义key
public static final AttributeKey<ServerSession> SESSION_KEY = AttributeKey.valueOf("SESSION_KEY");
// ......
// 通过设置将会话绑定到通道
channel.attr(SESSION_KEY).set(session);
// 取值
ServerSession session = ctx.channel().attr(SESSION_KEY).get();

AttributeKey的创建需要用到静态方法AttributeKey.valueOf(String)方法。该方法的返回值为一个AttributeKey实例,它的泛型类型为实际上的key-value键值对中value的键值对中value的实际类型。创建完AttributeKey之后就可以通过通道完成key-value的设值和取值了。

这里AttributeKey一般定义为一个常量,需要提前定义,它的泛型参数是Attribute最终的包装值的value的数据类型。

到此这篇关于Netty通道的容器属性Attribute详解的文章就介绍到这了,更多相关Netty的Attribute属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java中static关键字和内部类的使用

    详解Java中static关键字和内部类的使用

    这篇文章主要为大家详细介绍了Java中static关键字和内部类的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • java 二分法详解几种实现方法

    java 二分法详解几种实现方法

    这篇文章主要介绍了java 二分法详解几种方法的相关资料,需要的朋友可以参考下
    2017-02-02
  • java读取枚举类的值转成list和map方式

    java读取枚举类的值转成list和map方式

    这篇文章主要介绍了java读取枚举类的值转成list和map方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java中使用logger打印日志有哪些坑

    java中使用logger打印日志有哪些坑

    在Java中使用日志记录器(Logger)打印日志时,确实存在一些常见的坑需要注意,本文就来介绍一下几种方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • 详细解读Hibernate的缓存机制

    详细解读Hibernate的缓存机制

    这篇文章主要介绍了详细解读Hibernate的缓存机制,具有一定参考价值,这里分享给大家,供大家学习参阅。
    2017-10-10
  • Future与FutureTask接口实现示例详解

    Future与FutureTask接口实现示例详解

    这篇文章主要为大家介绍了Future与FutureTask接口实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 解决SpringBoot中LocalDateTime返回前端数据为数组结构的问题

    解决SpringBoot中LocalDateTime返回前端数据为数组结构的问题

    本文主要介绍了解决SpringBoot中LocalDateTime返回前端数据为数组结构的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Java8特性使用Function代替分支语句

    Java8特性使用Function代替分支语句

    这篇文章主要介绍了Java8特性使用Function代替分支语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java中数组的常见操作合集

    Java中数组的常见操作合集

    这篇文章主要为大家详细介绍了Java中数组的一些常见操作,例如:数组遍历、数组获取最大值元素、数组反转等,感兴趣的小伙伴可以了解一下
    2022-10-10
  • java 接口回调实例详解

    java 接口回调实例详解

    这篇文章主要介绍了java 接口回调实例详解的相关资料,所谓回调就是使用java中的多态,需要的朋友可以参考下
    2017-07-07

最新评论