whileアクティビティ作成時の処理内容
次のコードは、設計完了後の.bpelファイルの例を示しています。whileアクティビティ内にscopeアクティビティがあります。scopeアクティビティには、シーケンスおよびフォルト・ハンドラが最上位レベルに含まれています。シーケンスにはinvokeアクティビティ、assignアクティビティ、およびシーケンスにラップされたassignアクティビティとwaitアクティビティを含むcatchAllを定義するフォルト・ハンドラが含まれています。
次のコードにより、外部サービスがコールされます。外部サービスがフォルトをスローすると、フォルト・ハンドラによってフォルトが捕捉され、dbStatus変数値が増分されます。
したがって、whileループの終了条件は次のいずれかとなります。
-
例外がないこと(
dbStatus値が値10に設定されており、これにより、while条件はfalseと評価されます) -
フォルトが5回スローされた後であること(
dbStatus値が5に設定されており、while条件はfalseを返します)
<while name="While_1" condition="bpws:getVariableData('dbStatus') > 5">
<scope name="Scope_1">
<faultHandlers>
<catchAll>
<sequence name="Sequence_2">
<assign name="assign_DB_retry">
<copy>
<from expression="bpws:getVariableData('dbStatus') + 1"/>
<to variable="dbStatus"/>
</copy>
</assign>
<wait name="Wait_30_sec" for="'PT31S'"/>
</sequence>
</catchAll>
</faultHandlers>
<sequence name="Sequence_1">
<invoke name="Write_DBWrite" partnerLink="WriteDBRecord"
portType="ns2:WriteDBRecord_ptt" operation="insert"
inputVariable="Invoke_DBWrite_merge_InputVariable"/>
<assign name="Assign_dbComplete">
<copy>
<from expression="'10'"/>
<to variable="dbStatus"/>
</copy>
</assign>
</sequence>
</scope>
</while>ノート:
前の例のwhileアクティビティのコード・フラグメントでは、BPEL 1.1コンストラクトbpws:getVariableData('dbStatus')が使用されています。BPEL 2.0の場合、変数は$記号およびドット(.)表記法を使用して、直接参照されます。例:
<while name="While1"> <condition>$inputVariable.payload/client:counter > 0 </condition>