Channel:
channel對應一個socket,同時提供給用戶:
- channel當前的狀態(open? connected?)
- channel配置參數
- channel支持的io
- 提供一個處理所有請求的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,值自己設置。
channel和channelPipeline是相互綁定得關係,而channelHanlder每次註冊到pipeline上時就會又綁定一個channelHandlerContext,有了這個ctx就能對channel和handler進行交互。ctx能拿到channel和handler。
本文出自知乎
更多相關內容,Java架構師,軟件開發等學習資料,電子書及視頻還有高級講師公開課免費資源
需要的可以私聊小編髮送【學習】二字