異なるプロセスの実効と結果のギャザー:page-support-status: eolScheduled

Scatter-Gather カードを使用すると、同時に複数のカードセットを使用してメッセージを送信し、各セットから結果を収集して、結果を (元のメッセージと一緒に) フロー内の次のカードに渡すことができます。

フロー内の Scatter-Gather カード
Figure 1. この概略図は、2 つ以上のルートを含む Scatter-Gather カードを示しています。
1 どのカードからでも Scatter-Gather カードにメッセージを渡すことができます。現在のフローのトリガーや、フロー内の他のいずれのカードでもメッセージを渡すことができます。
2 Scatter-Gather カードは、大きな長方形内に表示されます。この長方形は、カードの​スコープ​と呼ばれます。このスコープ内に 2 つ以上のカードのセットがあり、各セットは​ルート​と呼ばれます。Scatter-Gather カードは、すべてのルートを同時に処理し、ルートはすべて互いに独立しています。各ルートには 1 つ以上のカードがあります。
3 すべてのルートでデータの処理が完了すると、各ルートからの結果が元のメッセージのペイロードに含められます。更新されたメッセージは、フローの次のカードに渡されます。

フロー内を移動するメッセージの一般的な構造は次のとおりです。

payload
attributes
vars

2 つのルートを含む Scatter-Gather カードから渡されるメッセージには、各ルートからのサブペイロードが含まれます。

payload
  0
    payload
  1
    payload
attributes
vars

2 つの Salesforce 組織からの取引先責任者の集約例

この例では、HTTP リスナーが要求を受け取ると、フローをトリガーします。Scatter-Gather カードは、2 つの Salesforce 組織から取引先責任者のリストを受け取るための 2 つのルートを開始します。Scatter-Gather カードは、Salesforce 用 Anypoint Connector (Salesforce Connector) の各インスタンスからのペイロードを 1 つのペイロードに組み合わせます。このペイロードは、2 つのクエリの結果を連結する変数に格納されます。最後に、連結された結果の項目がデータ型にマップされ、このデータ型から CSV ファイルが作成されます。

この例のフロー
Figure 2. 2 つの Salesforce 組織からの取引先責任者を集約した CSV ファイルを作成するフローは次のようになります。
1 フローをトリガーする HTTP リスナーカード。
2 各ルートが Salesforce Connector のインスタンスで構成される 2 つのルートを持つ Scatter-Gather カード。これらのインスタンスはそれぞれ異なる Salesforce 組織に対してクエリを実行します。
3 Scatter-Gather カードからの連結されたクエリの結果を変数に格納する Set Variable カード。
4 変数の項目を CSV ファイルの項目にマップする Transform カード。

まず、カスタムデータ型を次のように作成します。

カスタムデータ型を作成するためのダイアログ。
Figure 3. [Edit Custom Type (カスタム型を編集)]​ ダイアログでは、カスタムデータ型を作成できます。
1 [Format (形式)]​ 項目は ​[CSV]​ に設定します。
2 [Type (方)]​ 項目は ​[From schema (スキーマから)]​ に設定します。
3 スキーマは次のとおりです。
#%RAML 1.0 DataType
type: array
items:
  properties:
    Name:
      type: string
    ID:
      type: string
    Email:
      type: string

次に、​[Path (パス)]​ 項目で指定したパスをリッスンする HTTP リスナーカードを追加します。パスの名前は、コンピューターにダウンロードされる CSV ファイルに付けられます。

「Path (パス)」 項目の場所
Figure 4. [Path (パス)]​ 項目は ​[General (一般)]​ 設定にあります。

この例では HTTP リスナーカードを使用していますが、Scatter-Gather カードにはどのカードからでもデータを送信できます。

次に、Scatter-Gather カードを追加して、2 つのルートのそれぞれに Salesforce Connector のインスタンスを配置します。Salesforce Connector のインスタンスは、異なる Salesforce 組織に接続するため、異なる設定を使用します。したがって、異なる接続情報が必要です。

このクエリは、各インスタンスの ​[Salesforce Query (Salesforce クエリ)]​ 項目に指定します。

「Salesforce Query (Salesforce クエリ)」 項目のクエリと場所
Figure 5. [Salesforce Query (Salesforce クエリ)]​ 項目は ​[General (一般)]​ 設定にあります。

Scatter-Gather カードから渡されるメッセージには、以下の部分が含まれます。

payload
  0
    payload
      Name
      ID
      Email
  1
    payload
      Name
      ID
      Email
attributes
vars

Scatter-Gather カードからのペイロードには、カードの各ルートからのペイロードが 1 つずつ、合計 2 つのサブペイロードがあります。​0​ の下にあるサブペイロードはカードの最初のルートからのペイロードで、​1​ の下にあるサブペイロードはカードの 2 番目のルートからのペイロードです。

フローのこの時点で、DataWeave スクリプトを使用して 2 つのサブペイロードを 1 つの CSV ファイルに組み合わせることができます。ただし、DataWeave スクリプトを作成しない場合は、2 つのサブペイロードを 1 つのペイロードに連結して変数に格納し、1 つのペイロードの項目を CSV ファイルの項目にマップできます。

Set Variable カードには 1) 変数名と 2) ​[Value (値)]​ 項目の式が含まれます。2 つのサブペイロードを連結するための (3 の) 式は次のようになります。

payload["0"]["payload"] ++ (payload["1"]["payload"])

この式を作成するには、カードの右側から ​[Custom Expression (カスタム式)]​ ピルを ​[Value (値)]​ 項目までドラッグし、ピル内の矢印をクリックしてから ​[Expand (展開)]​ をクリックします。その後、最初の ​[Payload (ペイロード)]​ ピルをテキストボックスまでドラッグし、2 つのプラス記号を入力してから、2 番目の ​[Payload (ペイロード)]​ ピルをテキストボックスまでドラッグします。

fd sg 4 set variable
Figure 6. Set Variable​ カードは次のようになります。
1 指定された変数名
2 [Custom Expression (カスタム式)]​ を ​[Value (値)]​ 項目にドラッグすることで作成されるピル
3 クエリ結果を連結する式

Transform カードが Set Variable カードから受け取るメッセージには、次の部分が含まれています。

payload
  0
    payload
      Name
      ID
      Email
  1
    payload
      Name
      ID
      Email
attributes
vars
  SG_payload
    Name
    ID
    Email

変数 ​SG_payload​ の項目は、CSV 形式を使用するカスタムデータ型の項目にマップできます。

変数の項目の出力へのマッピング
Figure 7. 変数の項目をカスタムデータ型の項目にマップできます。
1 [Input (入力)]​ ペインでの変数の場所
2 変数の項目からカスタムデータ型の項目へのマッピング

Name​ 項目を入力ペインから出力ペインの ​Name​ 項目までドラッグします。​ID​ 項目と ​Email​ 項目についても同様の操作を行います。

結果は次のようになります。実際のコンテンツは、クエリを実行した Salesforce 組織によって異なります。最初の 12 件は組織 A からの取引先責任者で、ID はすべて ​0036g000009C​ で始まっています。残りは組織 B からの取引先責任者で、ID はすべて ​0028t000001J​ で始まっています。

変数へのメッセージデータの保存

ルートでメッセージの一部のみを処理したい場合には、メッセージが Scatter-Gather カードまたはルートの先端に達する前に、ルートで処理するデータのみを変数に格納できます。

変数を複数のルートで使用する必要がある場合には、以下の設定が便利です。

複数のルートで使用するデータの保存
Figure 8. データは、1 つ以上のルートが使用できる 1 つ以上の変数に保存できます。

この場合は、各ルートの最初のカードが同じメッセージを受け取りますが、Scatter-Gather カードの前に 2 つの変数を作成してある場合には、メッセージには以下の部分が含まれることがあります。

payload
attributes
vars
  var1
  var2

必要であれば、両方の変数を両方のルートで使用できます。

変数を 1 つのルートのみで使用する必要がある場合には、以下の設定が便利です。

1 つのルートでのみ使用されるデータの保存
Figure 9. 1 つのルートでのみ使用される変数にデータを保存できます。

最初のルートの先頭で ​var1​ を作成し、2 番目のルートの先頭で ​var2​ を作成するとします。そして、最初のルートの 2 番目のカードが、以下の部分を持つメッセージを受け取るとします。

payload
attributes
vars
  var1

さらに、2 番目のルートの 2 番目のカードが、以下の部分を持つメッセージを受け取るとします。

payload
attributes
vars
  var2

上のどちらの図でも、最後のカードが Transform カードであれば、DataWeave でのスクリプト作成が必要となる場合があります。最後のカードが別の Set Variable カードであれば、取引先責任者の集約の例で示したように、Scatter-Gather カードの各ルートからの結果を連結して、別のカード (Transform カードなど) に渡します。

Parallel For-Each、For-Each、Scatter-Gather の違い

For-Each は、1 つのルートで一度に 1 つの要素を処理しながら、要素のコレクションを反復処理します。

Parallel For-Each は、一度に複数の要素を処理しながら、要素のコレクションを ​n​ 回 (​n​ はコレクションの要素数以下の値) 処理します。たとえば、要素数が 10 で最大処理回数が 2 に設定されていれば、Parallel For-Each カードは、一度に 2 つの要素を処理し、合計 5 回の処理を実行します。

Scatter Gather は、​ルート​と呼ばれる 2 つ以上の並列プロセスを実行します。すべてのルートが終了すると、各ルートからの結果が新しいペイロードにギャザーされます。

Scatter-Gather カードの項目

Timeout (タイムアウト)

並列プロセスの結果が新しいペイロードにギャザーされて次のカードに送信されるまでの最大待ち時間 (ミリ秒)。0 または負の値は、タイムアウトが設定されていないことを意味します。デフォルト値は、64 ビット浮動小数点値の最大値である 9,223,372,036,854,776,000 ミリ秒です。

Max concurrency (最大同時実行)

並列に処理される最大ルート数。デフォルトでは、Scatter-Gather カードのインスタンスで作成したすべてのルートが並列に実行されます。

カードに表示されるデフォルト値は 2,147,483,647 です。デフォルト値がこの値になっている理由については気にする必要はありません。単に、この値を Scatter-Gather カードのスコープに含まれるルート数に設定しないと、スコープ内のルート数が実効値となることだけを理解しておいてください。

この値を 1 に設定すると、Scatter-Gather カードはペイロードの最初の要素を取って、各ルートでセットアップされている条件に対して評価し、条件を満足したルートで要素を送信します。ルートが要素の処理を完了すると、Scatter-Gather カードは次の要素をルート条件に対して評価し、ペイロードのすべての要素が処理されるまで同じ処理を繰り返します。

Scatter-Gather カードを設定する場合は、以下の項目に値を指定することができます (必須ではありません)。

Target (対象)

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

Target Value (対象値)

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