Flex Gateway新着情報
Governance新着情報
Monitoring API Managerコレクションを同時に処理される部分に分割して、メッセージのコレクションを処理します。
すべてのメッセージを処理した後で、このコンポーネントは分割前と同じ順序で結果を集約し、フローを続行します。
Parallel For Each では、すべての処理ルートの結果がリストにバッファされ、スコープの処理が終了した後にそのリストが返されます。これにより、大量のエントリを処理するときにメモリ不足エラーが発生する可能性があります。大きなペイロードを処理するには、代わりにバッチ処理を使用します。
このコンポーネントは、次の XML 構造をサポートします。
<parallel-foreach
doc:name="Parallel foreach"
doc:id="tbfiiz"
collection="#[payload]"
timeout=30000
maxConcurrency=15 />
Parallel For Each (<parallel-foreach/>
) 属性は UI および XML で設定できます。
属性名 | 属性 XML | 説明 |
---|---|---|
Parallel foreach (並列 foreach ) (デフォルト) |
|
キャンバスに表示されるコンポーネントの編集可能な名前。 |
なし |
|
コンポーネントの自動生成された識別子。 |
Collection (コレクション) |
|
コレクションを返す式。デフォルトは |
Timeout (タイムアウト) |
|
各並列ルートのタイムアウトをミリ秒単位で指定します。 |
Max concurrency (最大同時実行) |
|
ルーターが使用する並列性の最大レベルを指定します。 + デフォルトでは、すべてのルートが並列実行されます。 |
Target Variable (対象変数) |
|
メッセージデータを格納する変数の名前。数字、文字、アンダースコアのみを使用できます。たとえば、名前にハイフンは使用できません。 Mule ドキュメントの Enrich Data with Target Variablesを参照してください。 |
Target Value (対象値) |
|
対象変数に格納するデータの値。このデフォルト値はメッセージペイロード (payload) です。この項目は、変数が受け入れるすべての値を受け入れます。サポートされているデータ型、DataWeave の式、 |
次の例は、Parallel For Each を使用してコレクション内のすべての要素に文字列を追加する方法と、実行後の値に影響を与えずにスコープ内の変数を変更する方法を示しています。
次の例では、コレクション内のすべての要素に文字列「-result」
を追加します。
<flow name="myFlow">
<parallel-foreach collection="#[['apple', 'banana', 'orange']]">
<set-payload value="#[payload ++ '-result']"/>
</parallel-foreach>
</flow>
次の例は、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 つの要素の処理中に新しい変数を追加したり既存の変数を修正したりしても、別の要素の処理中は表示されません。これらのすべての変数の変更は、Parallel For Each スコープの外部では使用できません。Parallel For Each スコープの実行後、一連の変数 (およびその値) は実行前と同じままになります。
このスコープはすべてのルートを並列処理するため、1 つのルートでエラーが発生した場合、すべての処理が完了するまで、他のすべてのルートでは処理が続行されます。その後、次の例に示すように、Parallel For Each はすべての結果 (およびエラー) を集約し、エラーハンドラーによって処理します。
<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 previous 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>
For Each と Parallel For Each のどちらも定義済みコレクションを分割し、スコープ内のコンポーネントがコレクションの各要素を処理します。どちらの場合も、同じ初期コンテキストで各ルートが実行されます。これらの 2 つのスコープの違いは、次のとおりです。
For Each は順次処理で、Parallel For Each は並列処理です。 この違いはエラー処理に影響します。
処理の違いのため、For Each の実行はエラーの発生時に中断されてエラーハンドラーが呼び出されますが、Parallel For Each は MULE:COMPOSITE_ROUTE
エラー種別でエラーハンドラーを呼び出す前にすべてのルートを処理します。
For Each はペイロードを変更しませんが、Parallel For Each は各反復の出力メッセージのコレクションを出力します。