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 の一般的な SQL ステートメントの概要

1. mysqlエクスポートファイル: SELECT `pe2e_user_to_company`....

ウェブフロントエンドウェブ開発の一般的なプロセスの簡単な紹介

フロントエンド開発を行っている初心者の学生を多く見かけますが、彼らの効率は比較的遅いです。常にコード...

MySQLのよくある間違い

NULL 値によると、MySQL の NULL 値は単にデータがないことを意味します。NULL 値は...

Flexboxレイアウトの最もシンプルなフォーム実装

フレキシブル レイアウト (Flexbox) はますます人気が高まっており、CSS レイアウトの記述...

CentOSにDockerをインストールする方法

ここでは比較的簡単なインストール方法のみを紹介します。 1. yumを使用してインストールするyum...

Linux は、ディレクトリが存在するかどうかを判断するために if を使用します。

Linux で if を使用してディレクトリが存在するかどうかを判断する方法方法は次のとおりです。...

Linux で Sudo を使用して権限を委譲する

sudo 権限委譲の概要su スイッチ ID: su –l ユーザー名 –c 'コマンド&#...

MYSQLパターンマッチングREGEXPの使用に関する一般的な話など

のようにLIKE ではデータ全体が一致する必要がありますが、REGEXP では部分的な一致のみが必要...

MySQL で珍しい文字を挿入できないときの対処方法 (文字列値が正しくない)

最近、ビジネス側から、一部のユーザー情報の挿入に失敗し、エラー メッセージが「不正な文字列値:&qu...

Linux で履歴コマンドを表示および実行する方法

履歴コマンドを表示し、指定されたコマンドを実行します owen@owen:~/owen/softwa...

CSSはcalc()を使用して現在の表示画面の高さを取得します

まず、CSS3 の相対的な長さの単位を見てみましょう (詳細なチュートリアルを参照してください)。相...

MySQL データのバックアップと復元のサンプル コード

1. データのバックアップ1. mysqldumpコマンドを使用してバックアップするmysqldum...

スローモーションアニメーション効果を実現するJavaScript

この記事では、スローモーションアニメーション効果を実現するためのJavaScriptの具体的なコード...

ウェブサイトのアクセス速度を向上させるための徹底的な最適化に関するヒント

<br />ウェブサイトのアクセス速度はウェブサイトのトラフィックに直接影響を及ぼし、ウ...

MySQL で指定エンコーディングを実装する際の落とし穴について

前面に書かれた環境: MySQL 5.7+、MySQL データベースの文字エンコードは utf8、テ...