Tomcat パイプライン モードのパイプラインとバルブの詳細な説明

Tomcat パイプライン モードのパイプラインとバルブの詳細な説明

序文

比較的複雑な大規模システムでは、複雑なロジックで処理する必要があるオブジェクトまたはデータ フローが存在する場合、これらの複雑な論理プロセスを大規模なコンポーネントで実行することを選択できます。この方法は目的を達成しますが、単純で粗雑です。おそらく、この単純で粗雑なアプローチは、場合によっては問題を引き起こすでしょう。たとえば、処理ロジックの一部を変更したり、プロセスに処理ロジックを追加したり、プロセス内の処理ロジックを減らしたりしたい場合、ここでの一見単純な変更は、コンポーネント全体を変更する以外に、開始を困難にします。システム全体には拡張性と再利用性がないようです。

処理フロー全体を細かく分割できるモデルがあり、各小さなモジュールは互いに独立しており、ロジック処理の一部を担当します。これらのロジック処理の小さなモジュールは順番に接続され、前のモジュールの出力が次のモジュールの入力となり、最後のモジュールの出力が最終的な処理結果となります。これにより、ロジックを変更する際に特定のモジュールのみを変更すればよく、処理ロジックの追加や削減も特定のモジュール粒度に細分化でき、各モジュールを再利用できるため、再利用性が大幅に向上します。このモードは、この章で説明するパイプライン モードです。

名前が示すように、パイプライン モードは複数のオブジェクトをパイプラインのように接続します。全体的な外観は、パイプラインにネストされたいくつかのバルブのようであり、処理ロジックはバルブ上に配置されます。次の図に示すように、処理対象のオブジェクトがパイプラインに入ると、それぞれバルブ 1、バルブ 2、バルブ 3、バルブ 4 を通過します。各バルブは、入ってくるオブジェクトに対して何らかの論理処理を実行します。処理のレイヤーを経て、パイプラインの末尾から処理されます。このとき、オブジェクトは処理されたターゲット オブジェクトです。

パイプラインモードは非常に便利なので、プログラムで適切に使用することを検討してください。このモードを実現するには、複数のオブジェクトが連携する必要があります。次のクラス図を参照してください。Valveインターフェイスは、バルブの呼び出し方法を定義します。バルブは単一のリンクリスト構造を使用して互いに接続されているため、次に操作を提供する必要があります。バルブを実装して展開するだけです。Pipelineインターフェイスは、最初のバルブの取得、基本バルブの取得、バルブの追加などのメソッドを含む、パイプライン内のバルブを操作するためのメソッドを定義します。パイプラインはそれを展開する必要があります。


パイプライン パターンを簡単に実装する方法を見てみましょう。

① バルブインターフェース

パブリックインターフェースValve {
 パブリック Valve getNext();
 public void setNext(Valve バルブ);
 public void 呼び出し(文字列処理);
}

②パイプラインインターフェース

パブリックインターフェースパイプライン{
パブリック Valve getFirst();
パブリック Valve getBasic();
public void setBasic(Valve バルブ);
public void addValve(Valve バルブ);
}

③ 基本的なバルブ、処理ロジックは単に入力文字列の「aa」を「bb」に置き換えることです

パブリッククラス BasicValve は Valve を実装します {
保護されたバルブ next = null; 
パブリックバルブgetNext() {
次へ戻る;
}
パブリック void 呼び出し(文字列処理) {
    処理 = handling.replaceAll("aa", "bb");
System.out.println("基本的なバルブ処理後: " + 処理);
}
パブリック void setNext(バルブ バルブ) {
this.next = バルブ;
}
}

④ 2番目のバルブは、入力された文字列の「11」を「22」に置き換えます。

パブリッククラスSecondValveはValveを実装します{
保護されたバルブ next = null; 
パブリックバルブgetNext() {
次へ戻る;
}
パブリック void 呼び出し(文字列処理) {
処理 = handling.replaceAll("11", "22");
System.out.println("2 番目のバルブが処理された後: " + 処理);
getNext() を呼び出します (処理)。
}
パブリック void setNext(バルブ バルブ) {
this.next = バルブ;
}
}

⑤ 3番目のバルブは、入力文字列の「zz」を「yy」に置き換えます。

パブリッククラスThirdValveはValveを実装します{
保護されたバルブ next = null; 
パブリックバルブgetNext() {
次へ戻る;
}
パブリック void 呼び出し(文字列処理) {
処理 = handling.replaceAll("zz", "yy");
System.out.println("3 番目のバルブが処理された後: " + 処理);
getNext() を呼び出します (処理)。
}
パブリック void setNext(バルブ バルブ) {
this.next = バルブ;
}
}

⑥ パイプラインの場合、一般的な操作は、最初に setBasic を通じて基本バルブを設定し、次に他のバルブを順番に追加することです。実行順序は、最初に追加されたバルブが最初に実行され、基本バルブが最後に実行されます。

パブリッククラスStandardPipelineはPipelineを実装します{
保護されたバルブ first = null; 
保護されたバルブ basic = null; 
パブリック void addValve(バルブ バルブ) {
if (first == null) {
最初 = バルブ;
バルブを次の値に設定します。
} それ以外 {
バルブ電流 = 最初;
while (現在値 != null) {
(current.getNext() == 基本) の場合 {
current.setNext(バルブ);
バルブを次の値に設定します。
壊す;
}
現在の = current.getNext();
}
}
}
パブリックValve getBasic() {
基本を返します。
}
パブリックバルブgetFirst() {
最初に戻ります。
}
パブリック void setBasic(バルブ バルブ) {
this.basic = バルブ;
}
}

⑦ テストクラス

パブリッククラスMain {
パブリック静的voidメイン(String[] args) {
文字列処理="aabb1122zzyy";
StandardPipeline パイプライン = 新しい StandardPipeline();
BasicValve basicValve = 新しい BasicValve();
セカンドバルブ secondValve = new SecondValve();
サードバルブ thirdValve = new ThirdValve();
パイプラインにBasicバルブを設定します。
パイプラインに2番​​目のバルブを追加します。
パイプラインに第三のバルブを追加します。
パイプラインの getFirst() を呼び出します (処理)。
}
}

出力は次のようになります。

2番目のバルブが処理された後: aabb2222zzyy
3番目のバルブが処理された後: aabb2222yyyy
基本バルブ処理後: bbbb2222yyyy

これはパイプライン モードであり、パイプラインに 1 つ以上のバルブが接続されています。各バルブは論理処理の一部を担当し、データは規定の順序で流れていきます。このモードでは、論理処理タスクが分解され、タスク ユニットのインストールと分解が容易になり、プロセスのスケーラビリティ、再利用性、モビリティ、柔軟性が向上します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Pythonはパイプラインを使用してRedisのバッチ読み取りと書き込みを行います
  • Python: Scrapy フレームワークでのアイテム パイプライン コンポーネントの使用に関する詳細な説明
  • パイプラインを使用して Java で Redis バッチを読み書きする方法の詳細な説明 (hmset と hgetall)
  • パイプライン(PipeLine)とバッチ(Batch)操作を使用したRedisの大幅なパフォーマンス向上の詳細な説明
  • Scrapyカスタムパイプラインクラスは、収集したデータをMongoDBに保存する方法を実装します。
  • Tomcatの全体構造の簡単な紹介
  • セマフォによるTomcatの異常終了の解決方法

<<:  MacでのMySQL5.7.22のインストール手順

>>:  JSのバイナリファミリーについての簡単な説明

推薦する

MYSQL フルバックアップ、マスタースレーブレプリケーション、カスケードレプリケーション、および半同期の概要

MySQL フルバックアップ1. バイナリログを有効にし、データベースから分離して別々に保存する v...

Vue で動的に追加されたルーティング ページの更新時に失敗する理由と解決策

目次問題の説明シナリオインターフェースリターンフロントエンドメニューの定義vuex のメソッド問題原...

JS ES6における構造化分解についてお話しましょう

概要es6 では、配列またはオブジェクトから指定された要素を取得する新しい方法が追加されました。これ...

実行中の Docker コンテナにボリュームを動的に追加する方法

以前、Docker コンテナの起動後にボリュームをマウントできるかどうか尋ねられたことがあります。m...

UbuntuはCUDAの複数のバージョンをインストールし、いつでも切り替えることができます

CUDA とは何かを紹介するのではなく、複数の CUDA バージョンの共存とリアルタイム切り替えをど...

MySQL 8.0.19 のインストールと設定方法のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.19のインストールと設定のグラフィックチュートリアルを記...

見落としがちなMySQLのCOLLATIONの例の詳細な説明

序文MySQL データベースの文字列型は、CHAR、VARCHAR、BINARY、BLOB、TEXT...

MySQL の分離レベルの包括的な分析

データベースが同じデータ バッチを同時に追加、削除、および変更すると、ダーティ書き込み、ダーティ読み...

10分で始めるCSS3アニメーション

導入アニメーションを使用すると、JavaScript や jQuery に依存せずに、純粋な CSS...

MySQL 最適化技術における Limit クエリの最適化分析

序文実際のビジネスでは、ページングは​​一般的なビジネス要件です。次に、制限クエリを使用します。制限...

挿入前にレコードが既に存在するかどうかを確認するには、SQL ステートメントを使用します。

目次SQL文を挿入する前にレコードが既に存在するかどうかを確認するSQL挿入時の判断の簡単なコレクシ...

EXPLAIN を使って MySQL の SQL 実行プランを分析する方法

序文MySQL では、EXPLAIN コマンドを使用して、テーブルの接続方法や SELECT ステー...

Dockerfileを使用してApacheイメージを作成する方法

目次1. Dockerイメージ2. 既存のイメージに基づいてインスタンスを作成する3. ローカルテン...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

LinuxベースのApacheウェブサイトサービス構成の詳細な説明

オープンソース ソフトウェアである Apache は、最も広く使用されている Web アプリケーショ...