責任連鎖モデルについては誰もがよく知っていると思います。Tomcat や Spring などのさまざまなオープンソース製品で広く使用されています。
責任連鎖のデザインパターンの抽象化
上の図に示すように、責任連鎖プロジェクトの実装では、基本的にリンクされたリストまたは配列と、現在の実行場所のインデックス currentIndex が維持され、責任連鎖の doFilter() メソッドが呼び出されるたびに、currentIndex に基づいて次のフィルターが実行されます。
Netty での PipeLine の設計
このクラス図を通して、netty のパイプラインの設計も責任連鎖モデルを採用していることが大まかにわかります。ChannelHandler は ChannelHandlerContext の層をラップします。ChannelHandlerContext は、先頭と末尾の設計を通じてリンク リストを形成できます。外部呼び出しでは、ChannelPipeLine をエントリとして使用します。nelHandler。
実装全体の擬似コードを以下に示します。
——>ChannelHandlerContext#fireChannelActive
——>Handler#channelActive(ChannelHandlerContext context){
doSth();
ctx#next()
}
ChannelHandlerの解釈
NettyのchannelHandlerはoutboundHandlerとinboundHandlerに分かれており、ChannelHandler全体はoutboundHandler→write→read→inboundHandlerの書き込み→読み込みの順に実行されます。
たとえば、パイプラインが次のようにハンドラーを追加すると、
インバウンドの実行順序は 1、2、3、4、5 です。
アウトバウンドの実行順序は 5、4、3、2、1 です。
p.addLast("1", new InboundHandlerA());
p.addLast("2", new InboundHandlerB());
p.addLast("3", new OutboundHandlerA());
p.addLast("4", new OutboundHandlerB());
p.addLast("5", new InboundOutboundHandlerX());
ChannelHandler が channelPipeline に追加されると、ハンドラーの handlerAdded メソッドが自動的に実行されます。handlerAdded は、ハンドラーの追加後に実行される最初のメソッドであり、実行する必要がある最初のメソッドでもあります。handlerAdded が実行されない場合、ハンドラーの他のメソッドは実行できません。呼び出しチェーンが到着すると、ハンドラーは自動的にスキップされ、次のハンドラーが実行されます。全体の実行フローは以下の通りです。
ChannelHandler を追加 --> ChannelHandler#handlerAdded を実行 --> ChannelHandler#doSth --> fireNextChannelHandler -->
よく使用される ChannelHandler
1) ChannelInitializer: チャネルが EventLoop に登録された後、チャネルを迅速に初期化するために使用されます。原則として、ChannelInitializer 自体も ChannelHandler です。ChannelInitializer が HandlerAdded メソッドをトリガーすると、initChannel メソッドが呼び出されます。initChannel メソッドは書き換えることができ、ユーザーはさまざまなハンドラをカスタマイズできます。
2) ServerBootstrapAcceptor: このハンドラーは主に ServerChannel 側で新しいクライアント接続を受け入れ、新しく作成された childChannel を ChildEventLoop に登録するために使用されます。
3) SimpleChannelInboundHandler: このクラスを継承すると、String 型メッセージの処理を迅速に実装するなど、特定の種類のメッセージの処理を迅速に実装できます。
要約すると、netty プログラミングの主なプロセスは、チャネルの作成 --> チャネルのパイプラインの構成 --> チャネルをイベントループに登録 --> 接続を確立して IO 操作を開始することです。
さらにエキサイティングなコンテンツ、ぜひ注目してください
志胡: https://www.zhihu.com/people/mei-an-63
CSDN:https://blog.csdn.net/qq_42672856
ウィーチャット: