Netty源碼學習(3)-- Channel

Channel:

channel對應一個socket,同時提供給用戶:

  1. channel當前的狀態(open? connected?)
  2. channel配置參數
  3. channel支持的io
  4. 提供一個處理所有請求的channelPipeline

同時channel的channelConfig裡會有其註冊上的eventLoop

同時,對channel的所有IO操作都是異步的,所以調用IO後會立即返回。我們只能得到一個channelFuture,通過這個對象來判斷請求是否成功。


ChannelPipeline:

channel一般繼承自AbstractChannel,這個類裡面會有一個channelPipeline成員變量。

DefaultChannelPipeline裡面有一個head和tail來加減pipeline。

對於handler來說,inbount只處理入請求,outbount只處理出請求。

channelPipeline中的addLast方法提供一個重載方法,如果handler中的處理非常耗時,那麼可以傳進去一個eventGroup來單獨啟動線程,從而不去阻塞IO線程。


ConstantPool:

ConstantPool是netty的常量池:

public abstract class ConstantPool>

支持的泛型必須繼承自Constant,而Constant也是netty提供的一個類,有ID,Value(常量的名字)且必須實現Comparable方法。

常量池裡面有一個constants變量,

private final ConcurrentMap constants = PlatformDependent.newConcurrentHashMap();

一個atomicInteger來表示id

private final AtomicInteger nextId = new AtomicInteger(1);

如果調用getOrCreate方法,且contants中沒有這個方法,則進行創建:

<code>private T getOrCreate(String name) {
        T constant = constants.get(name);
        if (constant == null) {
            final T tempConstant = newConstant(nextId(), name);
            constant = constants.putIfAbsent(name, tempConstant);
            if (constant == null) {
                return tempConstant;
            }
        }

        return constant;
    }/<code>


Q: 為什麼要雙重判斷:如果兩個線程同時調用該方法,第二個線程新創建的tmpConstant會加不進去,如果不加第二個IF沒有,返回的值就是錯的。


ChannelOption:

channelOption本身就是個key(id, name),正真的值在pool裡面維護。

每一個channelConfig裡有一個常量池,常量池裡有多個channelOption做key,值自己設置。


Netty源碼學習(3)-- Channel

channel和channelPipeline是相互綁定得關係,而channelHanlder每次註冊到pipeline上時就會又綁定一個channelHandlerContext,有了這個ctx就能對channel和handler進行交互。ctx能拿到channel和handler。

本文出自知乎

Netty源碼學習(3)-- Channel

更多相關內容,Java架構師,軟件開發等學習資料,電子書及視頻還有高級講師公開課免費資源

需要的可以私聊小編髮送【學習】二字


分享到:


相關文章: