BPEL 2.0のforEachアクティビティによるアクティビティの複数のセットの処理
forEachアクティビティを使用すると、アクティビティの複数のセットを順次、または並行して処理できます。forEachアクティビティは、含まれている(子)scopeアクティビティを正確にN+1回実行し、Nは、最終カウンタ値から、「For Each」ダイアログの「カウンタの値」タブで指定する開始カウンタ値を引いた値に等しくなります。flowアクティビティなど、他の構造化アクティビティは、含まれているアクティビティとして任意のタイプのアクティビティを使用できますが、forEachアクティビティにはscopeアクティビティのみ含めることができます。
forEachアクティビティを開始すると、開始カウンタ値と最終カウンタ値に指定した式が評価されます。この2つの値は、返された後、アクティビティのライフサイクルの間は変化しません。どちらの式も、少なくとも1文字を含む値を返す必要があります。これらの式が有効な値を返さない場合、フォルトがスローされます。開始カウンタ値が最終カウンタ値より大きい場合、含まれているscopeアクティビティは実行されず、forEachアクティビティは完了したとみなされます。
各反復中に、「一般」タブの「カウンタ名」フィールドに指定された変数は、forEachアクティビティに含まれているスコープで暗黙的に宣言されます。スコープの最初の反復中に、カウンタ変数は開始カウンタ値で初期化されます。次の反復で、カウンタ変数は開始カウンタ値+1で初期化されます。その後の反復のたびに、前に初期化されたカウンタ変数値が1ずつ増分され、カウンタ値が最終カウンタ値に設定される最後の反復まで繰り返されます。カウンタ変数は、囲まれたscopeアクティビティに対してローカルです。反復中に値を変更できますが、各反復の後にその値は失われます。したがって、カウンタ変数値は次の反復のカウンタ値には影響しません。
forEachアクティビティは、次のループ反復をサポートしています。
-
順次(デフォルト)
forEachアクティビティは、scopeアクティビティ内で定義されている特定のアクティビティのセットに対して、ループ反復を順番にN回実行します。例として、forEachアクティビティは、注文書メッセージがN個の受注品目で構成される、受信注文書メッセージに対して繰り返されるとします。囲まれたscopeアクティビティはN+1回実行され、各インスタンスは前の反復が完了した後にのみ開始されます。
-
パラレル
すべてのループ反復は同時に開始され、並行して処理されます。並列反復は、独立したデータのセットが処理される環境、または異なるパートナとの独立した対話が並行して行われる環境で役に立ちます。並列ループを有効にするには、「一般」タブで「パラレル実行」チェック・ボックスを選択します。これらのシナリオでは、含まれているscopeアクティビティのN+1インスタンスが並行して実行されます。scopeアクティビティの各コピーには、順に実行されるforEachアクティビティに指定したのと同じ方法で宣言された、「一般」タブの「カウンタ名」フィールドで指定したものと同じカウンタ変数が使用されます。各インスタンスのカウンタ変数は、開始カウンタ値で始まり、最終カウンタ値まで増える整数値の1つで並行して一意に初期化される必要があります。
flowアクティビティと異なり、forEachアクティビティのパラレル・ブランチの数は設計時には不明です。指定されたカウンタ変数は、パラレル・ブランチ数を使用して繰り返され、開始カウンタ値および最終カウンタ値で制御されます。
「完了」タブで完了条件を指定することもできます。この条件により、forEachアクティビティは条件を実行し、指定されたすべてのブランチを実行または完了しなくても完了できます。例として、並列リクエストを送信し、十分な数の受信者のサブセットが返信したとします。次の状態を回避するために、オプションで完了条件が指定されます。
-
いくつかの子の実行(順次ケース)
-
一部の子の強制的な早期終了(パラレル・ケース)
完了条件を指定しない場合、forEachアクティビティは、含まれているscopeが完了したときに完了します。
(フォルトまたはtrue
と評価される完了条件により)早すぎる終了が発生した場合、N+1要件は適用されません。
次の例にforEachアクティビティの構文を示します。
<forEach counterName="MyVariableName" parallel="yes|no" standard-attributes> standard-elements <startCounterValue expressionLanguage="anyURI"?> unsigned-integer-expression </startCounterValue> <finalCounterValue expressionLanguage="anyURI"?> unsigned-integer-expression </finalCounterValue> <completionCondition>? <branches expressionLanguage="anyURI"? successfulBranchesOnly="yes|no"?>? unsigned-integer-expression </branches> </completionCondition> <scope ..>...</scope> </forEach>
ノート:
successfulBranchesOnly
属性はこのリリースではサポートされません。