---
schema_version: "1"
id: a1a9ac1d0aca042cc0a224a6fefb3c783772c3454a24d09a12b00e4c3ad866c5
title: Scatter-Gather ルーター
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/mule-runtime/4.5/scatter-gather-concept.md
canonical_url: https://docs.mulesoft.com/jp/mule-runtime/4.5/scatter-gather-concept
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 0f797a357304fa4a1dbcb17d66c62b4fab808c75312c777bbf4b78e3d267ff5b
description: MuleSoft Documentation Site
release: "4.5"
latest: false
---
# Scatter-Gather ルーター

Scatter-Gather コンポーネントは、異なるイベントプロセッサーを持つ異なる並列処理ルートで Mule イベントを処理するルーティングイベントプロセッサーです。各ルートは、Mule イベントへの参照を受け取り、1 つ以上の一連のイベントプロセッサーを実行します。各ルートは個別のスレッドを使用してイベントプロセッサーを実行します。実行後の Mule イベントは、元と同じ未変更の Mule イベントか、もしくは独自のペイロード、属性、変数を持つ新しい Mule イベントになります。Scatter-Gather コンポーネントは、各処理ルートから返された Mule イベントを新しい Mule イベントとして統合し、すべてのルートが正常に完了した場合にのみ、この Mule イベントを次のイベントプロセッサーに渡します。

Scatter-Gather コンポーネントは、複数のルートを (順次ではなく) 並列に実行します。ルートを並列実行することで、Mule アプリケーションの効率が大幅に向上し、順次処理よりも多くの情報を提供できます。

Scatter-Gather コンポーネントは、反復可能ストリームを処理します。失われる前に 1 回だけ読み取ることができる反復不可能なストリームは処理しません。コンポーネントのストリーム戦略が反復不可能に設定されていない限り、デフォルトではすべてのストリームが Mule で反復可能です。

Scatter-Gather コンポーネントの詳細な動作を次の図に示します。

![Scatter-Gather コンポーネントの図](/mulesoft/current/ja-jp/mule-runtime/4.5/_images/mruntime-scatter-gather.png)

<table><tbody><tr><td><i class="conum" data-value="1"></i><b>1</b></td><td>Scatter-Gather コンポーネントは Mule イベントを受け取って、この Mule イベントの参照を各処理ルートに送信します。</td></tr><tr><td><i class="conum" data-value="2"></i><b>2</b></td><td>各処理ルートは並列に実行を開始します。ルート内のすべてのプロセッサーが処理を完了すると、そのルートは Mule イベントを返します。この Mule イベントは、元と同じ未変更の Mule イベントか、もしくはルート内のプロセッサーによって変更が加えられて作成された新しい Mule イベントになります。</td></tr><tr><td><i class="conum" data-value="3"></i><b>3</b></td><td>すべての処理ルートが処理を完了すると、Scatter-Gather コンポーネントはすべてのルートから返された Mule イベントを統合して、フロー内の次のコンポーネントに渡します。</td></tr></tbody></table>

<table><tbody><tr><td class="icon"><i class="fa icon-warning" title="Warning"></i></td><td class="content">Scatter-Gather コンポーネントは、2 本以上のルートで設定してください。そうしないと、Mule アプリケーションは例外を返して実行されません。</td></tr></tbody></table>

## [](#結果)結果

すべてのルートが完了すると、コンポーネントによって次の形式で結果が出力されます: `{0: messageFromRoute0, 1: messageFromRoute1, …​}`

生成されたすべてのペイロードを配列に抽出するには、次のような DataWeave スクリプトを使用します。

```dw
flatten(valuesOf(payload) map ((item, index) -> item.*payload))
```

## [](#変数の伝播)変数の伝播

すべてのルートは同じ初期変数値で開始します。特定のルート内の変数の変更は他のルートに影響しません。そのため、1 つのルートで変数が追加されたり変更されたりした場合、集約後に、その値はそのルートによって定義されます。複数のルートによって変数が追加されたり変更されたりした場合、その値はすべてのルート内のその変数について定義されたすべての値のリストに追加されます。例:

```xml
<set-variable variableName="var1" value="var1"/>
<set-variable variableName="var2" value="var2"/>
<scatter-gather doc:name="Scatter-Gather" doc:id="abc665e0-6119-4ecb-9f8b-52dbcbb1d488" >
	<route >
		<set-variable variableName="var2" value="newValue"/>
        <set-variable variableName="var3" value="appleVal"/>
	</route>
	<route >
		<set-variable variableName="var3" value="bananaVal"/>
	</route>
	<route >
		<set-variable variableName="var3" value="otherVal"/>
        <set-variable variableName="var4" value="val4"/>
	</route>
</scatter-gather>
```

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

`{var1: "var1", var2: "newValue", var3: ["appleVal, bananaVal, otherVal"], var4: "val4"}`

## [](#scatter-gather-ルート内のエラー処理)Scatter-Gather ルート内のエラー処理

Scatter-Gather コンポーネントの各ルートで Try スコープを使用して、ルートのイベントプロセッサーで生成されるエラーを処理できます。実行されたいずれかのルートでエラーが発生すると、Scatter-Gather コンポーネントは ​`MULE:COMPOSITE_ROUTING`​ 種別のエラーをスローし、フローの処理はその Scatter-Gather コンポーネントから先には進みません。その代わりに、フローはエラー処理イベントプロセッサーに分岐します。

`MULE:COMPOSITE_ROUTING`​ エラーオブジェクトは、失敗したルートからのエラーだけではなく、正常に完了したルートからの Mule イベントも収集します。そのためアプリケーションは、エラー処理イベントプロセッサーを使用して、完了したルートからの Mule イベントを処理できます。

2 つのケースを使用して、この仕組みを分かりやすく説明します。

- Scatter-Gather コンポーネントの各ルートに Try スコープがあるケース。  
    いずれか 1 本のルートでエラーが生成され、そのルートの Try スコープで ​`on-error-continue`​ エラーハンドラーを使用して正常に処理されたため、そのルートは正常に完了します。Scatter-Gather コンポーネントは、すべてのルートからの Mule イベントを統合して新しい Mule イベントを生成し、統合したイベントを次のイベントプロセッサーに渡します。
- Scatter-Gather コンポーネントのいずれかのルートが Try スコープを持たないか、またはそのルートの Try スコープで該当のエラーの種類を処理できないエラーハンドラーを使用しているか、あるいはエラーハンドラーの種別が ​`on-error-propagate`​ であるケース。  
    このルートでエラーが発生すると、ルートは失敗して Scatter-Gather コンポーネントは ​`MULE:COMPOSITE_ROUTING`​ エラーをスローします。フローは、完了したルートからの Mule イベントを処理できるエラー処理イベントプロセッサーに分岐します。

こうしたエラーの処理の例:

```xml
<flow name="errorHandler">
    <scatter-gather>
        <route>
            <raise-error type="APP:MYERROR"/>
        </route>
        <route>
            <set-payload value="apple"/>
        </route>
    </scatter-gather>
    <error-handler>
        <on-error-continue type="MULE:COMPOSITE_ROUTING">
            <!-- This will have the error thrown by the first route -->
            <logger level="WARN" message="#[error.errorMessage.payload.failures['0']]"/>
            <!-- This will be a null value -->
            <logger level="WARN" message="#[error.errorMessage.payload.failures['1']]"/>

            <!-- This will be a null value -->
            <logger level="WARN" message="#[error.errorMessage.payload.results['0']]"/>
            <!-- This will have the result of the second (correctly executed) route -->
            <logger level="WARN" message="#[error.errorMessage.payload.results['1']]"/>
        </on-error-continue>
    </error-handler>
</flow>
```

## [](#scatter-gather-でのタイムアウトエラーの処理)Scatter-Gather でのタイムアウトエラーの処理

Scatter-Gather コンポーネントでタイムアウトを設定してある場合、そのタイムアウト時間内にルートが処理を完了しないと、そのルートは ​`MULE:TIMEOUT`​ エラーを返します。このエラーは、ルートで発生する他のエラーと同じように処理されます。各ルートが (処理を正常に完了するか、または ​`MULE:TIMEOUT`​ エラーをスローして) 完了すると、成功した結果とエラーが Scatter-Gather コンポーネントによって収集され、​`MULE:COMPOSITE_ROUTING`​ エラーとしてスローされます。このエラーは、設定されているエラーハンドラーで処理されます。

## [](#サンプルプロジェクト)サンプルプロジェクト

Scatter-Gather コンポーネントの使い方の詳細を見るには、Anypoint Studio で Anypoint Exchange からサンプルプロジェクトの ​_Scatter-Gather Flow Control (スキャッターギャザーフロー制御)_​ をダウンロードします。このサンプルは、データを並列に集約して結果を JSON で返すための Scatter-Gather 制御フローを示します。

また、このサンプルは用意されているデータを、集約する 2 つのリソースへの入力として使用します。このデータは、2 人の取引先責任者の情報を表し、次の構造となっています。

<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">リソース</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>firstname</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>surname</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>phone</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>email</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">contacts-1.csv</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">John</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Doe</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">096548763</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="mailto:john.doe@texasComp.com">john.doe@texasComp.com</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">contacts-2.csv</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Jane</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Doe</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">091558780</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="mailto:jane.doe@texasComp.com">jane.doe@texasComp.com</a></p></td>
</tr>
</tbody>
</table>

データの集約には DataWeave が使用されます。取引先責任者の情報は、両方のリソースからのデータを表す JSON 構造に集約されます。

Anypoint Studio でこのサンプルプロジェクトをダウンロードして開くには、左上隅にある \[Exchange\] アイコンをクリックします。次に、開いたウィンドウで、Anypoint Exchange にログインし、プロジェクトの名前を検索します。

## [](#scatter-gather-xml-リファレンス)Scatter-Gather XML リファレンス

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">要素</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>scatter-gather</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>複数の対象に要求メッセージを同時に送信します。応答をすべてのルートから収集して、単一のメッセージに集約します。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" colspan="2"><div class="content"><div class="paragraph">
<p><strong>属性</strong></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>timeout</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>送信したメッセージからの応答のタイムアウトをミリ秒単位で指定します。0 または負の値を指定すると、タイムアウトは設定されません。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>maxConcurrency</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>処理する並列ルートの最大数を指定します。<br>
デフォルトでは、すべてのルートが並列処理されます。</p>
</div>
<div class="paragraph">
<p>この値を 1 に設定すると、scatter-gather はルートを 1 本ずつ順次処理します。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>target</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>対象変数の名前。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>targetValue</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>対象変数に格納するデータの値。<br>
設定しないと、デフォルト値の ​<code>#[payload]</code>​ が使用されます。<br>
この項目は、変数が受け入れるすべての値を受け入れます。</p>
</div>
<div class="ulist">
<ul>
<li>
<p>サポートされる任意のデータ型。</p>
</li>
<li>
<p>DataWeave 式。</p>
</li>
<li>
<p>キーワードの ​<code>payload</code>​、​<code>attributes</code>​、​<code>message</code>​。​<code>vars</code>​ は​<em>受け入れられません</em>​。</p>
</li>
</ul>
</div></div></td>
</tr>
</tbody>
</table> <table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">子要素</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>route</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">scatter-gather ルーター内のいずれかのルート。</p></td>
</tr>
</tbody>
</table>

### [](#スロー)スロー

- `MULE:ROUTING`
- `MULE:COMPOSITE_ROUTING`

## [](#関連情報)関連情報

- [コアコンポーネント](https://docs.mulesoft.com/jp/mule-runtime/4.5/about-components)
- [トランザクションによるスコープとルーターへの影響](https://docs.mulesoft.com/jp/mule-runtime/4.5/transaction-management#tx_scopes_routers)
- [エラー処理](https://docs.mulesoft.com/jp/mule-runtime/4.5/error-handling)
- [Try スコープ](https://docs.mulesoft.com/jp/mule-runtime/4.5/try-scope-concept)