锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区三区高清视频,亚洲精彩视频在线观看,亚洲第一AV网站http://www.tkk7.com/DLevin/category/54919.htmlIn general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatrazh-cnFri, 04 Sep 2015 08:06:27 GMTFri, 04 Sep 2015 08:06:27 GMT60Netty3鏋舵瀯瑙f瀽http://www.tkk7.com/DLevin/archive/2015/09/04/427031.htmlDLevinDLevinFri, 04 Sep 2015 01:40:00 GMThttp://www.tkk7.com/DLevin/archive/2015/09/04/427031.htmlhttp://www.tkk7.com/DLevin/comments/427031.htmlhttp://www.tkk7.com/DLevin/archive/2015/09/04/427031.html#Feedback0http://www.tkk7.com/DLevin/comments/commentRss/427031.htmlhttp://www.tkk7.com/DLevin/services/trackbacks/427031.html鍓嶈寰堟棭浠ュ墠灝辨湁璇籒etty婧愮爜鐨勬墦綆椾簡錛岀劧鑰岀涓嬈″皾璇曠殑鏃跺欎粠Netty4寮濮嬶紝涓鐩存姄涓嶅埌鏍稿績鐨勬鏋舵祦紼嬶紝鍚庢潵鍥犱負(fù)鍏朵粬浜嬫儏蹇欑潃灝辨斁涓嬩簡銆傝繖嬈¤秮鐫浼戝亣閲嶆柊鎹¤搗榪欎釜紜澶達(dá)紝鍥犱負(fù)Netty3鐜板湪榪樺湪琚緢澶氶」鐩嬌鐢紝鍥犺岃繖嬈″喅瀹氬厛浠嶯etty3鍏ユ墜錛岀灛闂村彂鐜癗etty3鐨勪唬鐮佹瘮Netty4涓涓煩鐨勫錛屽緢澶氭蹇靛湪浠g爜鏈韓涓兘鏈夋竻鏅扮殑琛ㄨ揪錛屾墍浠ュ崐澶╁氨鎶婃暣涓鏋剁殑楠ㄦ灦鎼炴竻妤氫簡銆傚啀璇?a >Netty4瀵筃etty3鐨勬敼榪涙葷粨錛屽洖鍘昏Netty4鐨勬簮鐮侊紝鍙嶈岃寰楄交鏉句簡錛屼竴縐嶈眮鐒跺紑鏈楃殑鎰熻銆?br />
璁板緱鍘誨勾璇籎etty婧愮爜鐨勬椂鍊欙紝鍥犱負(fù)浠g爜澶簽澶э紝騫朵笖鑷繁鐨凥TTP Server鐨勪簡瑙eお灝戯紝鍥犺屽彧鑳借嚜搴曞悜涓婄殑涓涓竴涓ā鍧楃殑鍙犲姞錛岀洿鍒版渶鍚庢妸鎵浠ョ殑妯″潡榪炴帴鍦ㄤ竴璧瘋(gè)岀湅娓呭畠鐨勭湡姝f牳蹇冮鏋躲傜幇鍦ㄨ婧愮爜錛屽紑濮嬩範(fàn)鎯厛鎶婇鏋剁悊娓咃紝鐒跺悗寤朵幾鍒頒笉鍚岀殑鍣ㄥ畼銆佽鑲夎岀湅娓呮暣涓漢浣撱?br />
鏈枃浠嶳eactor妯″紡鍦∟etty3涓殑搴旂敤錛屽紩鍑篘etty3鐨勬暣浣撴灦鏋勪互鍙?qiáng)鎺у埗娴伣E嬶紱鐒惰岄櫎浜哛eactor妯″紡錛孨etty3榪樺湪ChannelPipeline涓嬌鐢ㄤ簡Intercepting Filter妯″紡錛岃繖涓ā寮忎篃鍦⊿ervlet鐨凢ilter涓垚鍔熶嬌鐢紝鍥犺屾湰鏂囪繕浼?xì)浠嶪ntercepting Filter妯″紡鍑哄彂璇︾粏浠嬬粛ChannelPipeline鐨勮璁$悊蹇點(diǎn)傛湰鏂囧亣璁捐鑰呭凡緇忓Netty鏈変竴瀹氱殑浜嗚В錛屽洜鑰屼笉浼?xì)鍖呭惈杩囧鍏ラ棬浠嬀l嶏紝浠ュ強(qiáng)甯甆etty鍋氬浼犵殑鏂囧瓧銆?br />

Netty3涓殑Reactor妯″紡

Reactor妯″紡鍦∟etty涓簲鐢ㄩ潪甯告垚鍔燂紝鍥犺屽畠涔熸槸鍦∟etty涓彈澶ц倖瀹d紶鐨勬ā寮忥紝鍏充簬Reactor妯″紡鍙互璇︾粏鍙傝冩湰浜虹殑鍙︿竴綃囨枃绔?a href="http://www.tkk7.com/DLevin/archive/2015/09/02/427045.html">銆奟eactor妯″紡璇﹁В銆?/a>錛屽Reactor妯″紡鐨勫疄鐜版槸Netty3鐨勫熀鏈鏋訛紝鍥犺屾湰灝忚妭浼?xì)璇l嗕粙緇峈eactor妯″紡濡備綍搴旂敤Netty3涓?br />
濡傛灉璇匯奟eactor妯″紡璇﹁В銆嬶紝鎴戜滑鐭ラ亾Reactor妯″紡鐢盚andle銆丼ynchronous Event Demultiplexer銆両nitiation Dispatcher銆丒vent Handler銆丆oncrete Event Handler鏋勬垚錛屽湪Java鐨勫疄鐜扮増鏈腑錛孋hannel瀵瑰簲Handle錛孲elector瀵瑰簲Synchronous Event Demultiplexer錛屽茍涓擭etty3榪樹嬌鐢ㄤ簡涓ゅ眰Reactor錛歁ain Reactor鐢ㄤ簬澶勭悊Client鐨勮繛鎺ヨ姹傦紝Sub Reactor鐢ㄤ簬澶勭悊鍜孋lient榪炴帴鍚庣殑璇誨啓璇鋒眰錛堝叧浜庤繖涓蹇佃繕鍙互鍙傝僁oug Lea鐨勮繖綃嘝PT錛?a >Scalable IO In Java錛夈傛墍浠ユ垜浠厛瑕佽В鍐砃etty3涓嬌鐢ㄤ粈涔堢被瀹炵幇鎵鏈夌殑涓婅堪妯″潡騫舵妸浠栦滑鑱旂郴鍦ㄤ竴璧風(fēng)殑錛屼互NIO瀹炵幇鏂瑰紡涓轟緥錛?br />
妯″紡鏄竴縐嶆娊璞★紝浣嗘槸鍦ㄥ疄鐜頒腑錛岀粡甯鎬細(xì)鍥犱負(fù)璇█鐗規(guī)с佹鏋跺拰鎬ц兘闇瑕佽屽仛涓浜涙敼鍙橈紝鍥犺孨etty3瀵筊eactor妯″紡鐨勫疄鐜版湁涓濂楄嚜宸辯殑璁捐錛?br />1. ChannelEvent錛?/strong>Reactor鏄熀浜庝簨浠剁紪紼嬬殑錛屽洜鑰屽湪Netty3涓嬌鐢–hannelEvent鎶借薄鐨勮〃杈綨etty3鍐呴儴鍙互浜х敓鐨勫悇縐嶄簨浠訛紝鎵鏈夎繖浜涗簨浠跺璞″湪Channels甯姪綾諱腑浜х敓錛屽茍涓旂敱瀹冨皢浜嬩歡鎺ㄥ叆鍒癈hannelPipeline涓紝ChannelPipeline鏋勫緩ChannelHandler綆¢亾錛孋hannelEvent嫻佺粡榪欎釜綆¢亾瀹炵幇鎵鏈夌殑涓氬姟閫昏緫澶勭悊銆侰hannelEvent瀵瑰簲鐨勪簨浠舵湁錛欳hannelStateEvent琛ㄧずChannel鐘舵佺殑鍙樺寲浜嬩歡錛岃屽鏋滃綋鍓岰hannel瀛樺湪Parent Channel錛屽垯璇ヤ簨浠惰繕浼?xì)浼犻掑埌Parent Channel鐨凜hannelPipeline涓紝濡侽PEN銆丅OUND銆丆ONNECTED銆両NTEREST_OPS絳夛紝璇ヤ簨浠跺彲浠ュ湪鍚勭涓嶅悓瀹炵幇鐨凜hannel銆丆hannelSink涓駭鐢燂紱MessageEvent琛ㄧず浠嶴ocket涓鍙栨暟鎹畬鎴愩侀渶瑕佸悜Socket鍐欐暟鎹垨ChannelHandler瀵瑰綋鍓峂essage瑙f瀽(濡侱ecoder銆丒ncoder)鍚庤Е鍙戠殑浜嬩歡錛屽畠鐢盢ioWorker銆侀渶瑕佸Message鍋氳繘涓姝ュ鐞嗙殑ChannelHandler浜х敓錛沇riteCompletionEvent琛ㄧず鍐欏畬鎴愯岃Е鍙戠殑浜嬩歡錛屽畠鐢盢ioWorker浜х敓錛汦xceptionEvent琛ㄧず鍦ㄥ鐞嗚繃紼嬩腑鍑虹幇鐨凟xception錛屽畠鍙互鍙戠敓鍦ㄥ悇涓瀯浠朵腑錛屽Channel銆丆hannelSink銆丯ioWorker銆丆hannelHandler涓紱IdleStateEvent鐢盜dleStateHandler瑙﹀彂錛岃繖涔熸槸涓涓狢hannelEvent鍙互鏃犵紳鎵╁睍鐨勪緥瀛愩傛敞錛氬湪Netty4鍚庯紝宸茬粡娌℃湁ChannelEvent綾伙紝鎵鏈変笉鍚屼簨浠墮兘鐢ㄥ搴旀柟娉曡〃杈撅紝榪欎篃鎰忓懗榪機(jī)hannelEvent涓嶅彲鎵╁睍錛孨etty4閲囩敤鍦–hannelInboundHandler涓姞鍏serEventTriggered()鏂規(guī)硶鏉ュ疄鐜拌繖縐嶆墿灞曪紝鍏蜂綋鍙互鍙傝?a >榪欓噷銆?br />2. ChannelHandler錛?/strong>鍦∟etty3涓紝ChannelHandler鐢ㄤ簬琛ㄧずReactor妯″紡涓殑EventHandler銆侰hannelHandler鍙槸涓涓爣璁版帴鍙o紝瀹冩湁涓や釜瀛愭帴鍙o細(xì)ChannelDownstreamHandler鍜孋hannelUpstreamHandler錛屽叾涓瑿hannelDownstreamHandler琛ㄧず浠庣敤鎴峰簲鐢ㄧ▼搴忔祦鍚慛etty3鍐呴儴鐩村埌鍚慡ocket鍐欐暟鎹殑綆¢亾錛屽湪Netty4涓敼鍚嶄負(fù)ChannelOutboundHandler錛汣hannelUpstreamHandler琛ㄧず鏁版嵁浠嶴ocket榪涘叆Netty3鍐呴儴鍚戠敤鎴峰簲鐢ㄧ▼搴忓仛鏁版嵁澶勭悊鐨勭閬擄紝鍦∟etty4涓敼鍚嶄負(fù)ChannelInboundHandler銆?br />3. ChannelPipeline錛?/strong>鐢ㄤ簬綆$悊ChannelHandler鐨勭閬擄紝姣忎釜Channel涓涓狢hannelPipeline瀹炰緥錛屽彲浠ヨ繍琛岃繃紼嬩腑鍔ㄦ佺殑鍚戣繖涓閬撲腑娣誨姞銆佸垹闄hannelHandler錛堢敱浜庡疄鐜扮殑闄愬埗錛屽湪鏈鏈鐨凜hannelHandler鍚戝悗娣誨姞鎴栧垹闄hannelHandler涓嶄竴瀹氬湪褰撳墠鎵ц嫻佺▼涓搗鏁堬紝鍙傝?a >榪欓噷錛夈侰hannelPipeline鍐呴儴緇存姢涓涓狢hannelHandler鐨勫弻鍚戦摼琛紝瀹冧互Upstream(Inbound)鏂瑰悜涓烘鍚戯紝Downstream(Outbound)鏂瑰悜涓烘柟鍚戙侰hannelPipeline閲囩敤Intercepting Filter妯″紡瀹炵幇錛屽叿浣撳彲浠ュ弬鑰?a href="http://www.tkk7.com/DLevin/archive/2015/09/03/427086.html">榪欓噷錛岃繖涓ā寮忕殑瀹炵幇鍦ㄥ悗涓鑺備腑榪樻槸璇︾粏浠嬬粛銆?br />4. NioSelector錛?/strong>Netty3浣跨敤NioSelector鏉ュ瓨鏀維elector錛圫ynchronous Event Demultiplexer錛夛紝姣忎釜鏂頒駭鐢熺殑NIO Channel閮藉悜榪欎釜Selector娉ㄥ唽鑷繁浠ヨ榪欎釜Selector鐩戝惉榪欎釜NIO Channel涓彂鐢熺殑浜嬩歡錛屽綋浜嬩歡鍙戠敓鏃訛紝璋冪敤甯姪綾籆hannels涓殑鏂規(guī)硶鐢熸垚ChannelEvent瀹炰緥錛屽皢璇ヤ簨浠跺彂閫佸埌榪欎釜Netty Channel瀵瑰簲鐨凜hannelPipeline涓紝鑰屼氦緇欏悇綰hannelHandler澶勭悊銆傚叾涓湪鍚慡elector娉ㄥ唽NIO Channel鏃訛紝Netty Channel瀹炰緥浠ttachment鐨勫艦寮忎紶鍏ワ紝璇etty Channel鍦ㄥ叾鍐呴儴鐨凬IO Channel浜嬩歡鍙戠敓鏃訛紝浼?xì)浠ttachment鐨勫艦寮忓瓨鍦ㄤ簬SelectionKey涓紝鍥犺屾瘡涓簨浠跺彲浠ョ洿鎺ヤ粠榪欎釜Attachment涓幏鍙栫浉鍏抽摼鐨凬etty Channel錛屽茍浠嶯etty Channel涓幏鍙栦笌涔嬬浉鍏寵仈鐨凜hannelPipeline錛岃繖涓疄鐜板拰Doug Lea鐨?a >Scalable IO In Java涓妯′竴鏍楓傚彟澶朜etty3榪橀噰鐢ㄤ簡Scalable IO In Java涓浉鍚岀殑Main Reactor鍜孲ub Reactor璁捐錛屽叾涓璑ioSelector鐨勪袱涓疄鐜幫細(xì)Boss鍗充負(fù)Main Reactor錛孨ioWorker涓篠ub Reactor銆侭oss鐢ㄦ潵澶勭悊鏂拌繛鎺ュ姞鍏ョ殑浜嬩歡錛孨ioWorker鐢ㄦ潵澶勭悊鍚勪釜榪炴帴瀵筍ocket鐨勮鍐欎簨浠訛紝鍏朵腑Boss閫氳繃NioWorkerPool鑾峰彇NioWorker瀹炰緥錛孨etty3妯″紡浣跨敤RoundRobin鏂瑰紡鏀懼洖NioWorker瀹炰緥銆傛洿褰㈣薄涓鐐圭殑錛屽彲浠ラ氳繃Scalable IO In Java鐨勮繖寮犲浘琛ㄨ揪錛?br />
鑻ヤ笌Ractor妯″紡瀵瑰簲錛孨ioSelector涓寘鍚簡Synchronous Event Demultiplexer錛岃孋hannelPipeline涓鐞嗙潃鎵鏈塃ventHandler錛屽洜鑰孨ioSelector鍜孋hannelPipeline鍏卞悓鏋勬垚浜咺nitiation Dispatcher銆?br />5. ChannelSink錛?/strong>鍦–hannelHandler澶勭悊瀹屾垚鎵鏈夐昏緫闇瑕佸悜瀹㈡埛绔啓鍝嶅簲鏁版嵁鏃訛紝涓鑸細(xì)璋冪敤Netty Channel涓殑write鏂規(guī)硶錛岀劧鑰屽湪榪欎釜write鏂規(guī)硶瀹炵幇涓紝瀹冧笉鏄洿鎺ュ悜鍏跺唴閮ㄧ殑Socket鍐欐暟鎹紝鑰屾槸浜ょ粰C(jī)hannels甯姪綾伙紝鍐呴儴鍒涘緩DownstreamMessageEvent錛屽弽鍚戜粠ChannelPipeline鐨勭閬撲腑嫻佽繃鍘伙紝鐩村埌絎竴涓狢hannelHandler澶勭悊瀹屾瘯錛屾渶鍚庝氦緇機(jī)hannelSink澶勭悊錛屼互閬垮厤闃誨鍐欒屽獎(jiǎng)鍝嶇▼搴忕殑鍚炲悙閲忋侰hannelSink灝嗚繖涓狹essageEvent鎻愪氦緇橬etty Channel涓殑writeBufferQueue錛屾渶鍚嶯ioWorker浼?xì)绛夊埌杩欎釜NIO Channel宸茬粡鍙互澶勭悊鍐欎簨浠舵椂鏃犻樆濉炵殑鍚戣繖涓狽IO Channel鍐欐暟鎹傝繖灝辨槸涓婂浘鐨剆end鏄粠SubReactor鐩存帴鍑哄彂鐨勫師鍥犮?br />6. Channel錛?/strong>Netty鏈夎嚜宸辯殑Channel鎶借薄錛屽畠鏄竴涓祫婧愮殑瀹瑰櫒錛屽寘鍚簡鎵鏈変竴涓繛鎺ユ秹鍙?qiáng)鍒扮殑鎵鏈夎祫婧愮殑楗敤錛屽灝佽NIO Channel銆丆hannelPipeline銆丅oss銆丯ioWorkerPool絳夈傚彟澶栧畠榪樻彁渚涗簡鍚戝唴閮∟IO Channel鍐欏搷搴旀暟鎹殑鎺ュ彛write銆佽繛鎺?緇戝畾鍒版煇涓湴鍧鐨刢onnect/bind鎺ュ彛絳夛紝涓漢鎰熻铏界劧瀵笴hannel鏈韓鏉ヨ錛屽洜涓哄畠?yōu)畞瑁呬簡NIO Channel錛屽洜鑰岃繖浜涙帴鍙e畾涔夊湪榪欓噷鏄悎鐞嗙殑錛屼絾鏄鏋滆冭檻鍒癗etty鐨勬灦鏋勶紝瀹冪殑Channel鍙槸涓涓祫婧愬鍣紝鏈夎繖涓狢hannel瀹炰緥灝卞彲浠ュ緱鍒板拰瀹冪浉鍏崇殑鍩烘湰鎵鏈夎祫婧愶紝鍥犺岃繖縐峸rite銆乧onnect銆乥ind鍔ㄤ綔涓嶅簲璇ュ啀鐢卞畠璐熻矗錛岃屾槸搴旇鐢卞叾浠栫被鏉ヨ礋璐o紝姣斿鍦∟etty4涓氨鍦–hannelHandlerContext娣誨姞浜唚rite鏂規(guī)硶錛岃櫧鐒秐etty4騫舵病鏈夊垹闄hannel涓殑write鎺ュ彛銆?br />

Netty3涓殑Intercepting Filter妯″紡

濡傛灉璇碦eactor妯″紡鏄疦etty3鐨勯鏋訛紝閭d箞Intercepting Filter妯″紡鍒欐槸Netty鐨勪腑鏋€俁eactor妯″紡涓昏搴旂敤鍦∟etty3鐨勫唴閮ㄥ疄鐜幫紝瀹冩槸Netty3鍏鋒湁鑹ソ鎬ц兘鐨勫熀紜錛岃孖ntercepting Filter妯″紡鍒欐槸ChannelHandler緇勫悎瀹炵幇涓涓簲鐢ㄧ▼搴忛昏緫鐨勫熀紜錛屽彧鏈夊緢濂界殑鐞嗚В浜嗚繖涓ā寮忔墠鑳戒嬌鐢ㄥソNetty錛岀敋鑷寵兘寰楀績搴旀墜銆?br />
鍏充簬Intercepting Filter妯″紡鐨勮緇嗕粙緇嶅彲浠ュ弬鑰?a href="http://www.tkk7.com/DLevin/archive/2015/09/03/427086.html">榪欓噷錛屾湰鑺備富瑕佷粙緇峃etty3涓Intercepting Filter妯″紡鐨勫疄鐜幫紝鍏跺疄灝辨槸DefaultChannelPipeline瀵笽ntercepting Filter妯″紡鐨勫疄鐜般傚湪涓婃枃鏈夋彁鍒癗etty3鐨凜hannelPipeline鏄疌hannelHandler鐨勫鍣紝鐢ㄤ簬瀛樺偍涓庣鐞咰hannelHandler錛屽悓鏃跺畠鍦∟etty3涓篃璧峰埌妗ユ鐨勪綔鐢紝鍗沖畠鏄繛鎺etty3鍐呴儴鍒版墍鏈塁hannelHandler鐨勬ˉ姊併備綔涓篊hannelPipeline鐨勫疄鐜拌匘efaultChannelPipeline錛屽畠浣跨敤涓涓狢hannelHandler鐨勫弻鍚戦摼琛ㄦ潵瀛樺偍錛屼互DefaultChannelPipelineContext浣滀負(fù)鑺傜偣錛?br />
public interface ChannelHandlerContext {
    Channel getChannel();

    ChannelPipeline getPipeline();

    String getName();

    ChannelHandler getHandler();

    
boolean canHandleUpstream();
    
boolean canHandleDownstream();
    
void sendUpstream(ChannelEvent e);
    
void sendDownstream(ChannelEvent e);
    Object getAttachment();

    
void setAttachment(Object attachment);
}

private final class DefaultChannelHandlerContext implements ChannelHandlerContext {
   
volatile DefaultChannelHandlerContext next;
   
volatile DefaultChannelHandlerContext prev;
   
private final String name;
   
private final ChannelHandler handler;
   
private final boolean canHandleUpstream;
   
private final boolean canHandleDownstream;
   
private volatile Object attachment;
.....
}
鍦―efaultChannelPipeline涓紝瀹冨瓨鍌ㄤ簡鍜屽綋鍓岰hannelPipeline鐩稿叧鑱旂殑Channel銆丆hannelSink浠ュ強(qiáng)ChannelHandler閾捐〃鐨刪ead銆乼ail錛屾墍鏈塁hannelEvent閫氳繃sendUpstream銆乻endDownstream涓哄叆鍙f祦緇忔暣涓摼琛細(xì)
public class DefaultChannelPipeline implements ChannelPipeline {
    
private volatile Channel channel;
    
private volatile ChannelSink sink;
    
private volatile DefaultChannelHandlerContext head;
    
private volatile DefaultChannelHandlerContext tail;
......
    
public void sendUpstream(ChannelEvent e) {
        DefaultChannelHandlerContext head 
= getActualUpstreamContext(this.head);
        
if (head == null) {
            
return;
        }
        sendUpstream(head, e);
    }

    
void sendUpstream(DefaultChannelHandlerContext ctx, ChannelEvent e) {
        
try {
            ((ChannelUpstreamHandler) ctx.getHandler()).handleUpstream(ctx, e);
        } 
catch (Throwable t) {
            notifyHandlerException(e, t);
        }
    }

    
public void sendDownstream(ChannelEvent e) {
        DefaultChannelHandlerContext tail 
= getActualDownstreamContext(this.tail);
        
if (tail == null) {
            
try {
                getSink().eventSunk(
this, e);
                
return;
            } 
catch (Throwable t) {
                notifyHandlerException(e, t);
                
return;
            }
        }
        sendDownstream(tail, e);
    }

    
void sendDownstream(DefaultChannelHandlerContext ctx, ChannelEvent e) {
        
if (e instanceof UpstreamMessageEvent) {
            
throw new IllegalArgumentException("cannot send an upstream event to downstream");
        }
        
try {
            ((ChannelDownstreamHandler) ctx.getHandler()).handleDownstream(ctx, e);
        } 
catch (Throwable t) {
            e.getFuture().setFailure(t);
            notifyHandlerException(e, t);
        }
    }
瀵筓pstream浜嬩歡錛屽悜鍚庢壘鍒版墍鏈夊疄鐜頒簡ChannelUpstreamHandler鎺ュ彛鐨凜hannelHandler緇勬垚閾撅紙getActualUpstreamContext()錛?/span>錛岃屽Downstream浜嬩歡錛屽悜鍓嶆壘鍒版墍鏈夊疄鐜頒簡ChannelDownstreamHandler鎺ュ彛鐨凜hannelHandler緇勬垚閾撅紙getActualDownstreamContext()錛夛細(xì)
    private DefaultChannelHandlerContext getActualUpstreamContext(DefaultChannelHandlerContext ctx) {
        
if (ctx == null) {
            
return null;
        }
        DefaultChannelHandlerContext realCtx 
= ctx;
        
while (!realCtx.canHandleUpstream()) {
            realCtx 
= realCtx.next;
            
if (realCtx == null) {
                
return null;
            }
        }
        
return realCtx;
    }
    
private DefaultChannelHandlerContext getActualDownstreamContext(DefaultChannelHandlerContext ctx) {
        
if (ctx == null) {
            
return null;
        }
        DefaultChannelHandlerContext realCtx 
= ctx;
        
while (!realCtx.canHandleDownstream()) {
            realCtx 
= realCtx.prev;
            
if (realCtx == null) {
                
return null;
            }
        }
        
return realCtx;
    }
鍦ㄥ疄闄呭疄鐜癈hannelUpstreamHandler鎴朇hannelDownstreamHandler鏃訛紝璋冪敤 ChannelHandlerContext涓殑sendUpstream鎴杝endDownstream鏂規(guī)硶灝嗘帶鍒舵祦紼嬩氦緇欎笅涓涓? ChannelUpstreamHandler鎴栦笅涓涓狢hannelDownstreamHandler錛屾垨璋冪敤Channel涓殑write鏂規(guī)硶鍙戦? 鍝嶅簲娑堟伅銆?br />
public class MyChannelUpstreamHandler implements ChannelUpstreamHandler {
    
public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
        
// handle current logic, use Channel to write response if needed.
        
// ctx.getChannel().write(message);
        ctx.sendUpstream(e);
    }
}

public class MyChannelDownstreamHandler implements ChannelDownstreamHandler {
    
public void handleDownstream(
            ChannelHandlerContext ctx, ChannelEvent e) 
throws Exception {
        
// handle current logic
        ctx.sendDownstream(e);
    }
}
褰揅hannelHandler鍚慍hannelPipelineContext鍙戦佷簨浠舵椂錛屽叾鍐呴儴浠庡綋鍓岰hannelPipelineContext鑺傜偣鍑哄彂鎵懼埌涓嬩竴涓狢hannelUpstreamHandler鎴朇hannelDownstreamHandler瀹炰緥錛屽茍鍚戝叾鍙戦丆hannelEvent錛屽浜嶥ownstream閾撅紝濡傛灉鍒拌揪閾懼熬錛屽垯灝咰hannelEvent鍙戦佺粰C(jī)hannelSink錛?br />
public void sendDownstream(ChannelEvent e) {
    DefaultChannelHandlerContext prev 
= getActualDownstreamContext(this.prev);
   
if (prev == null) {
       
try {
            getSink().eventSunk(DefaultChannelPipeline.
this, e);
        } 
catch (Throwable t) {
            notifyHandlerException(e, t);
        }
    } 
else {
        DefaultChannelPipeline.
this.sendDownstream(prev, e);
    }
}

public void sendUpstream(ChannelEvent e) {
    DefaultChannelHandlerContext next 
= getActualUpstreamContext(this.next);
   
if (next != null) {
        DefaultChannelPipeline.
this.sendUpstream(next, e);
    }
}
姝f槸鍥犱負(fù)榪欎釜瀹炵幇錛屽鏋滃湪涓涓湯灝劇殑ChannelUpstreamHandler涓厛縐婚櫎鑷繁錛屽湪鍚戞湯灝炬坊鍔犱竴涓柊鐨凜hannelUpstreamHandler錛屽畠鏄棤鏁堢殑錛屽洜涓哄畠鐨刵ext宸茬粡鍦ㄨ皟鐢ㄥ墠灝卞浐瀹氳緗負(fù)null浜嗐?br />
ChannelPipeline浣滀負(fù)ChannelHandler鐨勫鍣紝瀹冭繕鎻愪緵浜嗗悇縐嶅銆佸垹銆佹敼ChannelHandler閾捐〃涓殑鏂規(guī)硶錛岃屼笖濡傛灉鏌愪釜ChannelHandler榪樺疄鐜頒簡LifeCycleAwareChannelHandler錛屽垯璇hannelHandler鍦ㄨ娣誨姞榪汣hannelPipeline鎴栦粠涓垹闄ゆ椂閮戒細(xì)寰楀埌鍚屽織錛?br />
public interface LifeCycleAwareChannelHandler extends ChannelHandler {
    
void beforeAdd(ChannelHandlerContext ctx) throws Exception;
    
void afterAdd(ChannelHandlerContext ctx) throws Exception;
    
void beforeRemove(ChannelHandlerContext ctx) throws Exception;
    
void afterRemove(ChannelHandlerContext ctx) throws Exception;
}

public interface ChannelPipeline {
    
void addFirst(String name, ChannelHandler handler);
    
void addLast(String name, ChannelHandler handler);
    
void addBefore(String baseName, String name, ChannelHandler handler);
    
void addAfter(String baseName, String name, ChannelHandler handler);
    
void remove(ChannelHandler handler);
    ChannelHandler remove(String name);

    
<extends ChannelHandler> T remove(Class<T> handlerType);
    ChannelHandler removeFirst();

    ChannelHandler removeLast();

    
void replace(ChannelHandler oldHandler, String newName, ChannelHandler newHandler);
    ChannelHandler replace(String oldName, String newName, ChannelHandler newHandler);

    
<extends ChannelHandler> T replace(Class<T> oldHandlerType, String newName, ChannelHandler newHandler);
    ChannelHandler getFirst();

    ChannelHandler getLast();

    ChannelHandler get(String name);

    
<extends ChannelHandler> T get(Class<T> handlerType);
    ChannelHandlerContext getContext(ChannelHandler handler);

    ChannelHandlerContext getContext(String name);

    ChannelHandlerContext getContext(Class
<? extends ChannelHandler> handlerType);
    
void sendUpstream(ChannelEvent e);
    
void sendDownstream(ChannelEvent e);
    ChannelFuture execute(Runnable task);

    Channel getChannel();

    ChannelSink getSink();

    
void attach(Channel channel, ChannelSink sink);
    
boolean isAttached();
    List
<String> getNames();
    Map
<String, ChannelHandler> toMap();
}

鍦―efaultChannelPipeline鐨凜hannelHandler閾炬潯鐨勫鐞嗘祦紼嬩負(fù)錛?br />

鍙傝冿細(xì)

銆奛etty涓婚〉銆?/a>
銆奛etty婧愮爜瑙h錛堝洓錛塏etty涓嶳eactor妯″紡銆?/a>
銆奛etty浠g爜鍒嗘瀽銆?/a>
Scalable IO In Java
Intercepting Filter Pattern


DLevin 2015-09-04 09:40 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 久久夜色精品国产亚洲AV动态图| 亚洲国产激情在线一区| 国产成人亚洲综合无| 大陆一级毛片免费视频观看i| 成人最新午夜免费视频| 亚洲中字慕日产2021| 在线观看免费高清视频| 亚洲精品资源在线| 免费观看美女用震蛋喷水的视频| 成人亚洲综合天堂| 人成电影网在线观看免费| 久久久久亚洲AV无码专区网站| 亚洲国产日韩一区高清在线| 日本不卡免费新一区二区三区| 天天摸天天操免费播放小视频| 中文字幕中韩乱码亚洲大片| XXX2高清在线观看免费视频| 亚洲成年人在线观看| 亚洲免费观看网站| 国产精品亚洲四区在线观看| 毛片在线免费视频| 黄色一级毛片免费看| 亚洲精品狼友在线播放| 3344永久在线观看视频免费首页| 精品亚洲视频在线观看| 免费国产叼嘿视频大全网站| 精品亚洲麻豆1区2区3区| 久久久久国产精品免费免费搜索 | 成年黄网站色大免费全看| 亚洲最大的黄色网| 真实乱视频国产免费观看| 香蕉国产在线观看免费| 亚洲狠狠综合久久| 成熟女人牲交片免费观看视频| 色播亚洲视频在线观看| 大地资源免费更新在线播放| 一级中文字幕乱码免费| 亚洲日产2021三区在线| 免费一级肉体全黄毛片| 在线免费观看亚洲| 天堂亚洲免费视频|