一文詳解Java Netty中的Constant類
更新時間:2023年05月07日 11:58:04 作者:KittyGuy
這篇文章主要介紹了Constants類即常量類是將一些常用的變量集合到一個地方的類,文中有詳細的代碼示例,感興趣的同學可以參考一下
Constant
- Constant 和 ConstantPool 是用于表示常量的一種機制。
- Constant 接口定義了常量的基本屬性和方法,包括唯一標識 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進行管理。
- 注意范型T繼承自Constant。
- 常量都是類的形式。
ChannelConfig
- ChannelConfig是一個Channel的配置屬性集合。請將其向下轉換為更具體的配置類型,例如SocketChannelConfig,或使用setOptions(Map)來設置與傳輸相關的屬性:
Channel ch = ...; SocketChannelConfig cfg = (SocketChannelConfig) ch.getConfig(); cfg.setTcpNoDelay(false);
Option map是一個動態(tài)的只寫屬性,允許在不向下轉換其關聯的ChannelConfig的情況下配置一個Channel。
- 動態(tài)的只寫屬性是指,屬性值可以在程序運行時動態(tài)地進行修改,但只能進行寫操作,不能進行讀操作。在Option map中,只提供了設置屬性值的方法,沒有提供獲取屬性值的方法,因此稱之為只寫屬性。
- 不需要轉型:
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都可以用
- 要更新選項映射,請調用setOptions(Map)。所有的ChannelConfig都有以下選項:
名稱 關聯的設置方法 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的子類型中還有更多選項可用。例如,您可以根據SocketChannelConfig中所述的方式配置特定于TCP/IP套接字的參數。
- 要注意這些配置是真實存在的,不能亂配,UPD顯然是沒有?;顧C制的,就不能用
options.put(ChannelOption.SO_KEEPALIVE, true);
Netty中重要的Constant實現類:ChannelOption和AttributeKey
ChannelOption
- 該類就是以類型安全的方式配置ChannelConfig。
- 使用 ChannelOption 時可以通過編譯器進行類型檢查,從而避免在運行時出現類型錯誤的情況。
- 用例:
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
中存儲關聯的元數據。可以將Attribute
看作是一個鍵值對,其中鍵是一個AttributeKey
類型的對象,而值是任意類型的Java對象。Attribute
在網絡應用中有著廣泛的用途,例如:- 存儲和獲取連接的會話信息;
- 存儲和獲取連接的統計信息;
- 存儲和獲取連接的用戶權限信息;
- 存儲和獲取連接的特定狀態(tài)信息,如是否已經登錄等。
- 可以通過
Channel
的attr()
方法獲取一個AttributeMap
對象,用于存儲和獲取Attribute
。其中,AttributeMap
是一個接口,其默認實現為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 // ... } }
源碼學習
- ConstantPool中的valueOf方法
- 第一次檢測是為了避免重復創(chuàng)建,如果該常量已經存在,則直接返回該常量;第二次檢測是為了保證多線程下的線程安全,只有當該常量不存在時才創(chuàng)建新的常量,如果另一個線程已經創(chuàng)建了該常量,則直接返回已創(chuàng)建的常量。
- 如果不使用雙重檢測,可能會出現多個線程同時創(chuàng)建相同名稱的常量,導致產生多個相同的常量實例。因此,使用雙重檢測可以避免重復創(chuàng)建常量,并保證在多線程環(huán)境下的線程安全。
小結
Constant
類是 Netty 框架提供的用于實現常量池的類,通常用于框架內部的常量定義,而不是用于業(yè)務代碼的常量定義。AttributeKey
和ChannelOption
都是 Netty 中用于為Channel
和ChannelConfig
存儲屬性的機制,它們的主要區(qū)別在于作用的范圍和使用場景。ChannelOption
是一種可選配置項,它定義了ChannelConfig
可以使用的參數。ChannelOption
可以用于配置網絡協議的底層參數,例如 SO_LINGER 或 TCP_NODELAY 等。- 通常情況下,
ChannelOption
用于設置連接參數,例如連接超時時間、Nagle 算法等。 ChannelOption
是針對ChannelConfig
的,使用channel.config().setOption(option, value)
方法來設置。ChannelOption
適用于需要傳遞給 Netty 底層的配置參數。
- 通常情況下,
AttributeKey
則是用于在Channel
上存儲一些屬性,這些屬性通常是業(yè)務邏輯相關的,例如登錄用戶、登錄狀態(tài)等。AttributeKey
對象是一個標識符,可以在Channel
上存儲和訪問一個屬性值。- 與
ChannelOption
不同,AttributeKey
存儲的屬性是不透明的,Netty 不知道這些屬性的含義,因為是自定義的。 AttributeKey
適用于需要在業(yè)務邏輯中存儲和訪問數據的場景,例如在一個ChannelHandler
中存儲和讀取登錄用戶信息。
- 與
Attribute
用于在Channel
中存儲一些自定義的數據 ,這些數據可以被Channel
中的各個處理器共享和訪問。
以上就是一文詳解Java Netty中的Constant類的詳細內容,更多關于Netty Constant類的資料請關注腳本之家其它相關文章!
相關文章
Mybatis-plus與Mybatis依賴沖突問題解決方法
,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧這篇文章主要介紹了Mybatis-plus與Mybatis依賴沖突問題解決方法2021-04-04SpringBoot利用限速器RateLimiter實現單機限流的示例代碼
本文主要介紹了SpringBoot利用限速器RateLimiter實現單機限流的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Java中的NoClassDefFoundError報錯含義解析
這篇文章主要為大家介紹了Java中的NoClassDefFoundError含義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-11-11Java設計模式之單例模式Singleton Pattern詳解
這篇文章主要介紹了Java設計模式之單例模式Singleton Pattern詳解,一些常用的工具類、線程池、緩存,數據庫,數據庫連接池、賬戶登錄系統、配置文件等程序中可能只允許我們創(chuàng)建一個對象,這就需要單例模式,需要的朋友可以參考下2023-12-12