Netty通道的容器屬性Attribute詳解
Netty通道的容器屬性Attribute詳解
Netty中的Channel通道類,有類似于Map的容器功能,可以通過“key-value”鍵值對的形式來保存任何Java Object的值。一般來說可以存放一些與通道實例相關(guān)聯(lián)的屬性,比如說服務(wù)期端的ServerSession會話實例。
Netty對此的實現(xiàn)其實并沒有依賴Map接口,而是定義了一個類似的接口叫做AttributeMap。它有一個方法<T> Attribute<T>attr(AttributeKey<T> key),此方法接收一個AttributeKey類型的key,返回一個Attribute類型的值,即根據(jù)key獲取value。這里的AttributeKey不是原始的key,而是一個key的包裝類。AttributeKey確保了key的唯一性,在單個Netty應(yīng)用中,key值必須唯一。而Attribute也不是原始的value,而是value的包裝類。原始的value值就放置在Attribute包裝類中,可以通過Attribute包裝類實現(xiàn)value的讀取(get)和設(shè)置(set),取值和設(shè)置值。這個方法永遠不會返回null,但可能會返回一個尚未設(shè)置值的Attribute。
AttributeMap只是一個接口,Netty提供了默認(rèn)的實現(xiàn)DefaultAttributeMap(Channel通道類就是繼承了這個類)。這個類維護了一個DefaultAttribute(繼承自AtomicReference類,用來保存value值,此外還維護了AttributeKey屬性和DefaultAttributeMap屬性)類型的數(shù)組變量attributes,提供了對attr方法的實現(xiàn)。對于傳入的AttributeKey會在attributes中二分查找是否存在,如果不存在則將有序插入(根據(jù)key的id值,默認(rèn)后插入的id要大)。
AttributeMap的實現(xiàn)要求是線程安全的,所以在DefaultAttributeMap中的實現(xiàn)都采用拷貝副本的方式??梢酝ㄟ^AttributeMap的attr方法,根據(jù)key取得Attribute類型的value,然后根據(jù)value實例完成最終的兩個重要操作:設(shè)置(set)和取值(get)。
使用方式:
// 定義key public static final AttributeKey<ServerSession> SESSION_KEY = AttributeKey.valueOf("SESSION_KEY"); // ...... // 通過設(shè)置將會話綁定到通道 channel.attr(SESSION_KEY).set(session); // 取值 ServerSession session = ctx.channel().attr(SESSION_KEY).get();
AttributeKey的創(chuàng)建需要用到靜態(tài)方法AttributeKey.valueOf(String)方法。該方法的返回值為一個AttributeKey實例,它的泛型類型為實際上的key-value鍵值對中value的鍵值對中value的實際類型。創(chuàng)建完AttributeKey之后就可以通過通道完成key-value的設(shè)值和取值了。
這里AttributeKey一般定義為一個常量,需要提前定義,它的泛型參數(shù)是Attribute最終的包裝值的value的數(shù)據(jù)類型。
到此這篇關(guān)于Netty通道的容器屬性Attribute詳解的文章就介紹到這了,更多相關(guān)Netty的Attribute屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java中static關(guān)鍵字和內(nèi)部類的使用
這篇文章主要為大家詳細介紹了Java中static關(guān)鍵字和內(nèi)部類的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08java讀取枚舉類的值轉(zhuǎn)成list和map方式
這篇文章主要介紹了java讀取枚舉類的值轉(zhuǎn)成list和map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Future與FutureTask接口實現(xiàn)示例詳解
這篇文章主要為大家介紹了Future與FutureTask接口實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10解決SpringBoot中LocalDateTime返回前端數(shù)據(jù)為數(shù)組結(jié)構(gòu)的問題
本文主要介紹了解決SpringBoot中LocalDateTime返回前端數(shù)據(jù)為數(shù)組結(jié)構(gòu)的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03