攜手共進——《Netty IN ACTION》中文版《Netty實戰》答疑解惑
引子
共進
書中說的每一個Channel都具有唯一的id是什么意思呢,如果返回相同的hashCode就會報錯?
解惑:書中對于這一塊兒的描述其實不是特別的詳細,只是給出了結論,但是并沒有給出為何。首先id的意思是identity,即唯一標識,類似于我們的身份證。那么為何Channel的唯一標識必須是唯一的呢?這是因為一個網絡連接(這里不指面向連接、或者無連接的協議)總是由一個(SourceIP,SourcePORT,TargetIP,targetPORT )唯一確定的,這個四元組是不會重復的吧,這里排除(IP和端口)復用的情況。所以這就是為何設計成每個Channel的id都是唯一確定的。具體的可以查看io.netty.channel.AbstractChannel#compareTo的代碼。那么有什么時候報錯呢,如上面的代碼,即調用compareTo的時候。一個很常見的場景便是通過調用ChannelGroup的add(Channel)方法,將一個Channel添加到ChannelGroup時,其中ChannelGroup的內部使用了由ConcurrentHasmMap實現的ConcurrentHashSet,說到這里,讀者應該明白了吧,因為后面的邏輯,compareTo的調用已經是HashMap的邏輯了。
書中說的當一個ChannelHandler被標記為@Shareable的時候才可以被同時添加到多個ChannelPipeline中,否則的話就會報錯,這是為何呢?
解惑:書中并沒有提到源碼層面是如何實現的,實際上,在 Netty 目前基于?EventLoop?的線程模型中,Netty 是要求用戶的ChannelHandler的實現必須要是線程安全的。這樣,其便可以在不同的Channel的ChannelPipeline中安全的共享。所以,設計上為了避免非線程安全的ChannelHandler被錯誤地共享,所以 Netty 要求你標注一個ChannelHandler為@Shareable來指示它的線程安全性。在內部,每一個ChannelHandler都有一個isAdded字段,這個字段在ChannelPipeline的add/set*(ChannelHandler)被調用的時候將會讀取。源碼見:io.netty.channel.ChannelHandlerAdapter#added和io.netty.channel.DefaultChannelPipeline#checkMultiplicity。
本文轉載自異步社區。
軟件開發 編程語言 網絡 軟件開發 Web應用防火墻 WAF
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。