Parallel For Each スコープ

このバージョンの Mule は、拡張サポートが終了する 2023 年 5 月 2 日にその すべてのサポート​が終了しました。

このバージョンの Mule を使用する CloudHub には新しいアプリケーションをデプロイできなくなります。許可されるのはアプリケーションへのインプレース更新のみになります。

標準サポートが適用されている最新バージョンの Mule 4 にアップグレード​することをお勧めします。これにより、最新の修正とセキュリティ機能強化を備えたアプリケーションが実行されます。

Parallel For Each スコープにより、コレクションを同時処理に設定された制限のスコープ内で個別のルートで同時に処理される部分に分割することで、メッセージのコレクションを処理できます。すべてのメッセージが処理された後で、結果は分割前と同じ順序で集約され、その後もフローは続行されます。

ただし、この機能は Anypoint Studio の [Mule Palette (Mule パレット)] ビューでは使用できないため、XML で Parallel For Each スコープを手動で設定する必要があります。

Configuration (設定)

Parallel For Each スコープは次の項目から設定できます。

子要素 説明

Collection (コレクション) (​collection​)

並列で処理する部分のコレクションを定義する式を指定します。デフォルトでは、受信ペイロードを使用します。

属性 説明

Collection Expression (コレクション式) (​collection​)

コレクションを返す式。デフォルトでは、ペイロードは分割するコレクションとして扱われます。

Timeout (タイムアウト) (​timeout​)

各並列ルートのタイムアウトを指定します。デフォルトでは、タイムアウトはありません。

Max Concurrency (最大同時実行) (​maxConcurrency​)

ルーターが使用する並列性の最大レベルを指定します。デフォルトでは、すべてのルートが並列実行されます。

Target Variable (対象変数) (​target​)

処理されたペイロードを保存するために使用する変数を指定します。デフォルトでは、出力はフローのペイロードに保存されます。

Target Value (対象値) (​targetValue​)

操作の出力値に対して評価する式を指定します。この式の結果は対象変数に保存されます。デフォルトでは、これは操作の出力値と同じです。

この XML の例では、コレクションのすべての要素に文字列 ​"-result"​ を追加します。

<flow name="myFlow">

  <parallel-foreach collection="#[['apple', 'banana', 'orange']]">
      <set-payload value="#[payload ++ '-result']"/>
  </parallel-foreach>

</flow>

Parallel For Each スコープのすべての実行は、ブロックの実行前と同じ変数および値で開始されます。

1 つの要素の処理中に新しい変数を追加したり既存の変数を修正したりしても、別の要素の処理中は表示されません。これらのすべての変数の変更は Parallel For Each スコープ外で使用できないため、Parallel For Each スコープの実行後、一連の変数 (およびその値) は実行前と同じままになります。

次の例を考えてみましょう。

<flow name="myFlow">

  <set-variable variableName="var1" value="var1"/>
  <set-variable variableName="var2" value="var2"/>
  <parallel-foreach collection="#[['apple', 'banana', 'orange']]">
      <choice>
          <when expression="#[payload == 'apple']">
              <set-variable variableName="var2" value="newValue"/>
              <set-variable variableName="var3" value="appleVal"/>
          </when>
          <when expression="#[payload == 'banana']">
              <set-variable variableName="var3" value="bananaVal"/>
          </when>
          <otherwise>
              <set-variable variableName="var3" value="otherVal"/>
              <set-variable variableName="var4" value="val4"/>
          </otherwise>
      </choice>
  </parallel-foreach>

</flow>

集約後、変数は次のようになります。

{var1: "var1", var2: "var2"}

変数の新規作成を含めて、Parallel For Each スコープ内で実行された変更は一切登録されません。

エラー処理

すべてのルートは並列処理されるため、1 つのルートでエラーがスローされた場合、すべての処理が完了するまで、他のすべてのルートでは処理が続行されます。その後、ここで示しているように、すべての結果 (およびエラー) が集約されてから、​Error Handler​ によって処理されます。

<flow name="myFlow">

  <parallel-foreach collection="#['banana', 'apple']">
      <choice>
          <when expression="#[payload == 'banana']">
              <!-- Processor that throws error -->
          </when>
          <otherwise>
              <set-payload value="#[payload ++ '-result']"/>
          </otherwise>
      </choice>
  </parallel-foreach>
  <error-handler>
      <on-error-continue type="COMPOSITE_ROUTING">
          <!-- This will have the error thrown by the above processor -->
          <logger message="#[error.errorMessage.payload.failures['0']]"/>
          <!-- This will be a null value -->
          <logger message="#[error.errorMessage.payload.failures['1']]"/>
          <!-- This will be a null value -->
          <logger message="#[error.errorMessage.payload.results['0']]"/>
          <!-- This will have the result of this (correctly executed) route -->
          <logger message="#[error.errorMessage.payload.results['1']]"/>
      </on-error-continue>
  </error-handler>

</flow>

スロー

  • MULE:COMPOSITE_ROUTING

For Each スコープと Parallel For Each スコープの違い

For Each と Parallel For Each のどちらも定義済みコレクションを分割し、スコープ内のコンポーネントがコレクションの各要素を処理します。どちらの場合も、同じ初期コンテキストで各ルートが実行されます。これらの 2 つのスコープの違いは、次のとおりです。

  • For Each は順次処理で、Parallel For Each は並列処理です。 この違いは​エラー処理​に影響します。

    処理の違いのため、For Each の実行はエラーの発生時に中断されてエラーハンドラーが呼び出されますが、Parallel For Each は ​MULE:COMPOSITE_ROUTE​ エラー種別でエラーハンドラーを呼び出す前にすべてのルートを処理します。

  • For Each はペイロードを変更しませんが、Parallel For Each は各反復の出力メッセージのコレクションを出力します。