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のバイナリファミリーについての簡単な説明

推薦する

きちんとしたHTMLマークアップを使用してページを構築します

インターネットは絶えず進化する有機体です。長期にわたってインターネットの発展に適応できるページを構築...

Maven+Tomcat 基本イメージを構築する Docker の実装

序文Javaプログラミングでは、ほとんどのアプリケーションはMavenに基づいて構築されており、配信...

純粋な HTML タグにどれくらい精通していますか?

以下の HTML タグには、基本的に既存のタグがすべて含まれています。数分かけて 1 つずつ参照する...

Vue ルーターにパラメータを渡すときにページを更新するとパラメータが失われる問題に対処する方法

目次概要方法1: params経由でパラメータを渡す方法2: クエリを通じてパラメータを渡す方法3:...

Vueは宮殿のグリッド回転抽選を実現します

Vueは宮殿グリッド回転抽選(CrossFireのxx転生に似ている)を実装しています。参考までに、...

テキストの展開と折りたたみの効果を実現するJavaScript

リスト形式のテキストの展開と折りたたみの実装は参考までに。具体的な内容は以下のとおりです。必要: 1...

MySQLのROUND関数の丸め演算における落とし穴の分析

この記事では、MySQL の ROUND 関数を使用した丸め操作の落とし穴を例を使って説明します。ご...

JS の Promise に中止関数を追加する方法

目次概要プロミスレースメソッド約束の再パッケージ化中止コントローラAxiosプラグインにはキャンセル...

IE8を閲覧するときにウェブサイトが自動的にIE7互換モードを使用するようにする

序文IE の将来のすべてのバージョンで Web ページの外観が一貫していることを保証するために、IE...

docker に openjdk をインストールして jar パッケージを実行する方法

画像をダウンロード docker プル openjdkデータボリュームの作成java_appデータボ...

Vueは動的ルーティングの詳細を実装します

目次1. フロントエンド制御1. router.js ファイル内 (router.js にそれぞれ静...

Vueウォッチの監視方法の概要

目次1. Vueにおけるwatchの役割はその名の通り、監視の役割です。 2. このオブジェクトのプ...

さまざまなネットワーク画像形式におけるPNGの利点の詳細な説明

BMP は、ハードウェア デバイスに依存せず、広く使用されている画像ファイル形式です。ビットマップ保...

Docker ベースの MySQL マスタースレーブ レプリケーションを実装する方法

序文MySQL マスター/スレーブ レプリケーションは、アプリケーションの高パフォーマンスと高可用性...

Reactの新バージョンのライフサイクルフック機能と使用方法の詳細な説明

旧ライフサイクルと比較して 3つのフックが廃止され、2つの新しいフックが追加されましたReact16...