欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解Java Netty中的Constant類

 更新時間:2023年05月07日 11:58:04   作者:KittyGuy  
這篇文章主要介紹了Constants類即常量類是將一些常用的變量集合到一個地方的類,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考一下

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)登錄等。
  • 可以通過Channelattr()方法獲取一個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ù)代碼的常量定義。
  • AttributeKeyChannelOption 都是 Netty 中用于為 ChannelChannelConfig 存儲屬性的機(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)文章

  • Idea中如何修改項目的SVN地址

    Idea中如何修改項目的SVN地址

    這篇文章主要介紹了Idea中如何修改項目的SVN地址問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Mybatis-plus與Mybatis依賴沖突問題解決方法

    Mybatis-plus與Mybatis依賴沖突問題解決方法

    ,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧這篇文章主要介紹了Mybatis-plus與Mybatis依賴沖突問題解決方法
    2021-04-04
  • SpringBoot利用限速器RateLimiter實現(xiàn)單機(jī)限流的示例代碼

    SpringBoot利用限速器RateLimiter實現(xiàn)單機(jī)限流的示例代碼

    本文主要介紹了SpringBoot利用限速器RateLimiter實現(xiàn)單機(jī)限流的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向

    詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向

    這篇文章主要介紹了詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java中的NoClassDefFoundError報錯含義解析

    Java中的NoClassDefFoundError報錯含義解析

    這篇文章主要為大家介紹了Java中的NoClassDefFoundError含義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-11-11
  • 一文秒懂logstash收集springboot日志的方法

    一文秒懂logstash收集springboot日志的方法

    通過這篇文章帶你了解logstash收集springboot日志的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之雙向鏈表

    Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之雙向鏈表

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后繼結(jié)點。本文將為大家詳細(xì)介紹雙向鏈表的特點與使用,需要的可以參考一下
    2021-12-12
  • Java設(shè)計模式之單例模式Singleton Pattern詳解

    Java設(shè)計模式之單例模式Singleton Pattern詳解

    這篇文章主要介紹了Java設(shè)計模式之單例模式Singleton Pattern詳解,一些常用的工具類、線程池、緩存,數(shù)據(jù)庫,數(shù)據(jù)庫連接池、賬戶登錄系統(tǒng)、配置文件等程序中可能只允許我們創(chuàng)建一個對象,這就需要單例模式,需要的朋友可以參考下
    2023-12-12
  • Spring Boot Admin郵件警報整合過程解析

    Spring Boot Admin郵件警報整合過程解析

    這篇文章主要介紹了Spring Boot Admin郵件警報整合過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • mybatis中大批量數(shù)據(jù)插入解析

    mybatis中大批量數(shù)據(jù)插入解析

    這篇文章主要介紹了mybatis中大批量數(shù)據(jù)插入解析,使用Mybatis框架批量插入的3種方法,分別是多次調(diào)用insert方法、foreach標(biāo)簽、batch模式,本文來詳細(xì)說明一下,需要的朋友可以參考下
    2024-01-01

最新評論