一文詳解Java Netty中的Constant類
Constant
- Constant 和 ConstantPool 是用于表示常量的一種機(jī)制。
- Constant 接口定義了常量的基本屬性和方法,包括唯一標(biāo)識 ID、名稱。
- value就是Constant本身,確定范型的具體類型即可。
class Main { public static void main(String[] args) { MyConstant value = new MyConstant(); System.out.println(value.PI); System.out.println(value.object); } static class MyConstant implements Constant<MyConstant> { public double PI = 3.1415926; public Object object = new Object(); private final int id; private final String name; public MyConstant() { id = new Random().nextInt(); name = id + "#"; } @Override public int id() { return id; } @Override public String name() { return name; } @Override public int compareTo(MyConstant other) { return Integer.compare(id, other.id); } } }
- 但是一般通過ConstantPool進(jìn)行管理。
- 注意范型T繼承自Constant。
- 常量都是類的形式。
ChannelConfig
- ChannelConfig是一個Channel的配置屬性集合。請將其向下轉(zhuǎn)換為更具體的配置類型,例如SocketChannelConfig,或使用setOptions(Map)來設(shè)置與傳輸相關(guān)的屬性:
Channel ch = ...; SocketChannelConfig cfg = (SocketChannelConfig) ch.getConfig(); cfg.setTcpNoDelay(false);
Option map是一個動態(tài)的只寫屬性,允許在不向下轉(zhuǎn)換其關(guān)聯(lián)的ChannelConfig的情況下配置一個Channel。
- 動態(tài)的只寫屬性是指,屬性值可以在程序運行時動態(tài)地進(jìn)行修改,但只能進(jìn)行寫操作,不能進(jìn)行讀操作。在Option map中,只提供了設(shè)置屬性值的方法,沒有提供獲取屬性值的方法,因此稱之為只寫屬性。
- 不需要轉(zhuǎn)型:
Channel ch = ...; Map<ChannelOption<?>, Object> options = new HashMap<>(); options.put(ChannelOption.SO_TIMEOUT, 5000); options.put(ChannelOption.SO_KEEPALIVE, true); ch.config().setOptions(options); //不需要SocketChannelConfig cfg = (SocketChannelConfig) ch.getConfig(); //所有Channel都可以用
- 要更新選項映射,請調(diào)用setOptions(Map)。所有的ChannelConfig都有以下選項:
名稱 關(guān)聯(lián)的設(shè)置方法 ChannelOption.CONNECT_TIMEOUT_MILLIS setConnectTimeoutMillis(int) ChannelOption.WRITE_SPIN_COUNT setWriteSpinCount(int) ChannelOption.WRITE_BUFFER_WATER_MARK setWriteBufferWaterMark(WriteBufferWaterMark) ChannelOption.ALLOCATOR setAllocator(ByteBufAllocator) ChannelOption.AUTO_READ setAutoRead(boolean)
- 在ChannelConfig的子類型中還有更多選項可用。例如,您可以根據(jù)SocketChannelConfig中所述的方式配置特定于TCP/IP套接字的參數(shù)。
- 要注意這些配置是真實存在的,不能亂配,UPD顯然是沒有?;顧C(jī)制的,就不能用
options.put(ChannelOption.SO_KEEPALIVE, true);
Netty中重要的Constant實現(xiàn)類:ChannelOption和AttributeKey
ChannelOption
- 該類就是以類型安全的方式配置ChannelConfig。
- 使用 ChannelOption 時可以通過編譯器進(jìn)行類型檢查,從而避免在運行時出現(xiàn)類型錯誤的情況。
- 用例:
Bootstrap b = new Bootstrap(); b.group(group) .channel(NioSocketChannel.class) .remoteAddress(new InetSocketAddress("example.com", 80)) // 使用 ChannelOption 配置連接超時時間 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
AttributeKey
- 注意這是Key,它是映射到Attribute的。
- 在Netty中,
Attribute
用于在Channel
中存儲關(guān)聯(lián)的元數(shù)據(jù)??梢詫?code>Attribute看作是一個鍵值對,其中鍵是一個AttributeKey
類型的對象,而值是任意類型的Java對象。Attribute
在網(wǎng)絡(luò)應(yīng)用中有著廣泛的用途,例如:- 存儲和獲取連接的會話信息;
- 存儲和獲取連接的統(tǒng)計信息;
- 存儲和獲取連接的用戶權(quán)限信息;
- 存儲和獲取連接的特定狀態(tài)信息,如是否已經(jīng)登錄等。
- 可以通過
Channel
的attr()
方法獲取一個AttributeMap
對象,用于存儲和獲取Attribute
。其中,AttributeMap
是一個接口,其默認(rèn)實現(xiàn)為DefaultAttributeMap
,可以使用它來操作Attribute
。 - 用例:
public class MyHandler { private final Attribute<AtomicInteger> messageCounterAttr; public MyHandler(Channel channel) { messageCounterAttr = channel.attr(AttributeKey.valueOf("messageCounter")); messageCounterAttr.set(new AtomicInteger(0)); } public void handle(Object msg) { // increment message counter AtomicInteger messageCounter = messageCounterAttr.get(); messageCounter.incrementAndGet(); // do other things with the message // ... } }
源碼學(xué)習(xí)
- ConstantPool中的valueOf方法
- 第一次檢測是為了避免重復(fù)創(chuàng)建,如果該常量已經(jīng)存在,則直接返回該常量;第二次檢測是為了保證多線程下的線程安全,只有當(dāng)該常量不存在時才創(chuàng)建新的常量,如果另一個線程已經(jīng)創(chuàng)建了該常量,則直接返回已創(chuàng)建的常量。
- 如果不使用雙重檢測,可能會出現(xiàn)多個線程同時創(chuàng)建相同名稱的常量,導(dǎo)致產(chǎn)生多個相同的常量實例。因此,使用雙重檢測可以避免重復(fù)創(chuàng)建常量,并保證在多線程環(huán)境下的線程安全。
小結(jié)
Constant
類是 Netty 框架提供的用于實現(xiàn)常量池的類,通常用于框架內(nèi)部的常量定義,而不是用于業(yè)務(wù)代碼的常量定義。AttributeKey
和ChannelOption
都是 Netty 中用于為Channel
和ChannelConfig
存儲屬性的機(jī)制,它們的主要區(qū)別在于作用的范圍和使用場景。ChannelOption
是一種可選配置項,它定義了ChannelConfig
可以使用的參數(shù)。ChannelOption
可以用于配置網(wǎng)絡(luò)協(xié)議的底層參數(shù),例如 SO_LINGER 或 TCP_NODELAY 等。- 通常情況下,
ChannelOption
用于設(shè)置連接參數(shù),例如連接超時時間、Nagle 算法等。 ChannelOption
是針對ChannelConfig
的,使用channel.config().setOption(option, value)
方法來設(shè)置。ChannelOption
適用于需要傳遞給 Netty 底層的配置參數(shù)。
- 通常情況下,
AttributeKey
則是用于在Channel
上存儲一些屬性,這些屬性通常是業(yè)務(wù)邏輯相關(guān)的,例如登錄用戶、登錄狀態(tài)等。AttributeKey
對象是一個標(biāo)識符,可以在Channel
上存儲和訪問一個屬性值。- 與
ChannelOption
不同,AttributeKey
存儲的屬性是不透明的,Netty 不知道這些屬性的含義,因為是自定義的。 AttributeKey
適用于需要在業(yè)務(wù)邏輯中存儲和訪問數(shù)據(jù)的場景,例如在一個ChannelHandler
中存儲和讀取登錄用戶信息。
- 與
Attribute
用于在Channel
中存儲一些自定義的數(shù)據(jù) ,這些數(shù)據(jù)可以被Channel
中的各個處理器共享和訪問。
以上就是一文詳解Java Netty中的Constant類的詳細(xì)內(nèi)容,更多關(guān)于Netty Constant類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis-plus與Mybatis依賴沖突問題解決方法
,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧這篇文章主要介紹了Mybatis-plus與Mybatis依賴沖突問題解決方法2021-04-04SpringBoot利用限速器RateLimiter實現(xiàn)單機(jī)限流的示例代碼
本文主要介紹了SpringBoot利用限速器RateLimiter實現(xiàn)單機(jī)限流的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向
這篇文章主要介紹了詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Java中的NoClassDefFoundError報錯含義解析
這篇文章主要為大家介紹了Java中的NoClassDefFoundError含義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-11-11Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之雙向鏈表
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后繼結(jié)點。本文將為大家詳細(xì)介紹雙向鏈表的特點與使用,需要的可以參考一下2021-12-12Java設(shè)計模式之單例模式Singleton Pattern詳解
這篇文章主要介紹了Java設(shè)計模式之單例模式Singleton Pattern詳解,一些常用的工具類、線程池、緩存,數(shù)據(jù)庫,數(shù)據(jù)庫連接池、賬戶登錄系統(tǒng)、配置文件等程序中可能只允許我們創(chuàng)建一個對象,這就需要單例模式,需要的朋友可以參考下2023-12-12