一文詳解Java Netty中的Constant類
Constant
- Constant 和 ConstantPool 是用于表示常量的一種機(jī)制。
- Constant 接口定義了常量的基本屬性和方法,包括唯一標(biāo)識(shí) 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是一個(gè)Channel的配置屬性集合。請(qǐng)將其向下轉(zhuǎn)換為更具體的配置類型,例如SocketChannelConfig,或使用setOptions(Map)來設(shè)置與傳輸相關(guān)的屬性:
Channel ch = ...; SocketChannelConfig cfg = (SocketChannelConfig) ch.getConfig(); cfg.setTcpNoDelay(false);
Option map是一個(gè)動(dòng)態(tài)的只寫屬性,允許在不向下轉(zhuǎn)換其關(guān)聯(lián)的ChannelConfig的情況下配置一個(gè)Channel。
- 動(dòng)態(tài)的只寫屬性是指,屬性值可以在程序運(yùn)行時(shí)動(dòng)態(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都可以用
- 要更新選項(xiàng)映射,請(qǐng)調(diào)用setOptions(Map)。所有的ChannelConfig都有以下選項(xiàng):
名稱 關(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的子類型中還有更多選項(xiàng)可用。例如,您可以根據(jù)SocketChannelConfig中所述的方式配置特定于TCP/IP套接字的參數(shù)。
- 要注意這些配置是真實(shí)存在的,不能亂配,UPD顯然是沒有?;顧C(jī)制的,就不能用
options.put(ChannelOption.SO_KEEPALIVE, true);
Netty中重要的Constant實(shí)現(xiàn)類:ChannelOption和AttributeKey
ChannelOption
- 該類就是以類型安全的方式配置ChannelConfig。
- 使用 ChannelOption 時(shí)可以通過編譯器進(jìn)行類型檢查,從而避免在運(yùn)行時(shí)出現(xiàn)類型錯(cuò)誤的情況。

- 用例:
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.remoteAddress(new InetSocketAddress("example.com", 80))
// 使用 ChannelOption 配置連接超時(shí)時(shí)間
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)AttributeKey
- 注意這是Key,它是映射到Attribute的。


- 在Netty中,
Attribute用于在Channel中存儲(chǔ)關(guān)聯(lián)的元數(shù)據(jù)??梢詫?code>Attribute看作是一個(gè)鍵值對(duì),其中鍵是一個(gè)AttributeKey類型的對(duì)象,而值是任意類型的Java對(duì)象。Attribute在網(wǎng)絡(luò)應(yīng)用中有著廣泛的用途,例如:- 存儲(chǔ)和獲取連接的會(huì)話信息;
- 存儲(chǔ)和獲取連接的統(tǒng)計(jì)信息;
- 存儲(chǔ)和獲取連接的用戶權(quán)限信息;
- 存儲(chǔ)和獲取連接的特定狀態(tài)信息,如是否已經(jīng)登錄等。
- 可以通過
Channel的attr()方法獲取一個(gè)AttributeMap對(duì)象,用于存儲(chǔ)和獲取Attribute。其中,AttributeMap是一個(gè)接口,其默認(rèn)實(shí)現(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方法

- 第一次檢測(cè)是為了避免重復(fù)創(chuàng)建,如果該常量已經(jīng)存在,則直接返回該常量;第二次檢測(cè)是為了保證多線程下的線程安全,只有當(dāng)該常量不存在時(shí)才創(chuàng)建新的常量,如果另一個(gè)線程已經(jīng)創(chuàng)建了該常量,則直接返回已創(chuàng)建的常量。
- 如果不使用雙重檢測(cè),可能會(huì)出現(xiàn)多個(gè)線程同時(shí)創(chuàng)建相同名稱的常量,導(dǎo)致產(chǎn)生多個(gè)相同的常量實(shí)例。因此,使用雙重檢測(cè)可以避免重復(fù)創(chuàng)建常量,并保證在多線程環(huán)境下的線程安全。
小結(jié)
Constant類是 Netty 框架提供的用于實(shí)現(xiàn)常量池的類,通常用于框架內(nèi)部的常量定義,而不是用于業(yè)務(wù)代碼的常量定義。AttributeKey和ChannelOption都是 Netty 中用于為Channel和ChannelConfig存儲(chǔ)屬性的機(jī)制,它們的主要區(qū)別在于作用的范圍和使用場(chǎng)景。ChannelOption是一種可選配置項(xiàng),它定義了ChannelConfig可以使用的參數(shù)。ChannelOption可以用于配置網(wǎng)絡(luò)協(xié)議的底層參數(shù),例如 SO_LINGER 或 TCP_NODELAY 等。- 通常情況下,
ChannelOption用于設(shè)置連接參數(shù),例如連接超時(shí)時(shí)間、Nagle 算法等。 ChannelOption是針對(duì)ChannelConfig的,使用channel.config().setOption(option, value)方法來設(shè)置。ChannelOption適用于需要傳遞給 Netty 底層的配置參數(shù)。
- 通常情況下,
AttributeKey則是用于在Channel上存儲(chǔ)一些屬性,這些屬性通常是業(yè)務(wù)邏輯相關(guān)的,例如登錄用戶、登錄狀態(tài)等。AttributeKey對(duì)象是一個(gè)標(biāo)識(shí)符,可以在Channel上存儲(chǔ)和訪問一個(gè)屬性值。- 與
ChannelOption不同,AttributeKey存儲(chǔ)的屬性是不透明的,Netty 不知道這些屬性的含義,因?yàn)槭亲远x的。 AttributeKey適用于需要在業(yè)務(wù)邏輯中存儲(chǔ)和訪問數(shù)據(jù)的場(chǎng)景,例如在一個(gè)ChannelHandler中存儲(chǔ)和讀取登錄用戶信息。
- 與
Attribute用于在Channel中存儲(chǔ)一些自定義的數(shù)據(jù) ,這些數(shù)據(jù)可以被Channel中的各個(gè)處理器共享和訪問。
以上就是一文詳解Java Netty中的Constant類的詳細(xì)內(nèi)容,更多關(guān)于Netty Constant類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實(shí)現(xiàn)mysql操作類分享 java連接mysql
這篇文章主要介紹了java實(shí)現(xiàn)的mysql操作類示例,大家在連接數(shù)據(jù)的時(shí)候可以直接使用了2014-01-01
springboot+idea熱部署的實(shí)現(xiàn)方法(自動(dòng)刷新)
這篇文章主要介紹了springboot+idea熱部署的實(shí)現(xiàn)方法(自動(dòng)刷新),本文分步驟通過實(shí)例代碼截圖相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
java遠(yuǎn)程連接調(diào)用Rabbitmq的實(shí)例代碼
本篇文章主要介紹了java遠(yuǎn)程連接調(diào)用Rabbitmq的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
Java開發(fā)必備知識(shí)之?dāng)?shù)組詳解
數(shù)組對(duì)于每一門編程語(yǔ)言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語(yǔ)言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同.本篇文章為大家整理了Java最全關(guān)于數(shù)組的知識(shí)點(diǎn),并給出其對(duì)應(yīng)的代碼,需要的朋友可以參考下2021-06-06

