Netty通道的容器屬性Attribute詳解
Netty通道的容器屬性Attribute詳解
Netty中的Channel通道類,有類似于Map的容器功能,可以通過“key-value”鍵值對的形式來保存任何Java Object的值。一般來說可以存放一些與通道實例相關聯(lián)的屬性,比如說服務期端的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應用中,key值必須唯一。而Attribute也不是原始的value,而是value的包裝類。原始的value值就放置在Attribute包裝類中,可以通過Attribute包裝類實現(xiàn)value的讀?。╣et)和設置(set),取值和設置值。這個方法永遠不會返回null,但可能會返回一個尚未設置值的Attribute。
AttributeMap只是一個接口,Netty提供了默認的實現(xiàn)DefaultAttributeMap(Channel通道類就是繼承了這個類)。這個類維護了一個DefaultAttribute(繼承自AtomicReference類,用來保存value值,此外還維護了AttributeKey屬性和DefaultAttributeMap屬性)類型的數(shù)組變量attributes,提供了對attr方法的實現(xiàn)。對于傳入的AttributeKey會在attributes中二分查找是否存在,如果不存在則將有序插入(根據(jù)key的id值,默認后插入的id要大)。
AttributeMap的實現(xiàn)要求是線程安全的,所以在DefaultAttributeMap中的實現(xiàn)都采用拷貝副本的方式。可以通過AttributeMap的attr方法,根據(jù)key取得Attribute類型的value,然后根據(jù)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的創(chuàng)建需要用到靜態(tài)方法AttributeKey.valueOf(String)方法。該方法的返回值為一個AttributeKey實例,它的泛型類型為實際上的key-value鍵值對中value的鍵值對中value的實際類型。創(chuàng)建完AttributeKey之后就可以通過通道完成key-value的設值和取值了。
這里AttributeKey一般定義為一個常量,需要提前定義,它的泛型參數(shù)是Attribute最終的包裝值的value的數(shù)據(jù)類型。
到此這篇關于Netty通道的容器屬性Attribute詳解的文章就介紹到這了,更多相關Netty的Attribute屬性內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Future與FutureTask接口實現(xiàn)示例詳解
這篇文章主要為大家介紹了Future與FutureTask接口實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10解決SpringBoot中LocalDateTime返回前端數(shù)據(jù)為數(shù)組結構的問題
本文主要介紹了解決SpringBoot中LocalDateTime返回前端數(shù)據(jù)為數(shù)組結構的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-03-03