説明
<call> 要素は、ビジネス・オペレーションまたはビジネス・プロセスに要求 (同期または非同期) を送信します。<call> 要素には、要求の作成方法を決定する必須の属性 async があります。
-
async が 0 (偽) の場合、要求が同期として作成されます。つまり、応答を受け取った後で、ビジネス・プロセスの実行が再開されます。
Important:
<call> 要素に async='False' と <response> ブロックを定義することにより、呼び出した操作が完了するまで、ビジネス・プロセスのスレッドの実行を保留できます。
<call> 要素に async='False' を定義し、<response> ブロックを定義していない場合の動作は、async='True' を定義した場合と同じになります。同期要求は送信する必要はあるが、応答は必要ないという場合は、機能しない <response> ブロックを作成します。これにより、ターゲット・ホストの完了を待って <call> が実行を継続するようにします。
-
async が 1 (真) の場合、要求が非同期として作成されます。つまり、要求を送信した後で、ビジネス・プロセスの実行が再開されます。複数の非同期呼び出しからの応答を後で受け取るには、<sync> 要素を使用して、応答を待機している <call> 要素のリストを指定します。詳細は、このドキュメントの <sync> トピックを参照してください。
<call> 要素には、<request> と <response> とい子要素があります。これらは、呼び出しの作成で使用する要求オブジェクトと応答オブジェクトのクラスを指定します。どちらの要素にも、1 つ以上の <assign> 要素を含めることができます。<request> 要素では、<assign> 要素を使用して、その呼び出しに必要な要求オブジェクトのプロパティを指定します。<response> 要素では、結果として返された応答オブジェクトのプロパティを、ビジネス・プロセスの実行コンテキストの context 変数や response 変数など、別の場所に移動する必要がある場合に <assign> 要素を使用します。
Note:
ビジネス・プロセスの実行コンテキストの詳細は、<assign> 要素の説明を参照してください。"BPL プロセスの開発" の “BPL プロセスについて” の章で “ビジネス・プロセスの実行コンテキスト” も参照してください。
非同期要求の場合、<response> 要素の本体に含まれる <assign> 要素は、対応する要求を受け取ったときに実行されます。これがいつ実行されるかはわかりません。そのためビジネス・プロセスでは、通常、<sync> 要素を使用して非同期応答を待ちます。<sync> 要素で指定されている timeout 時間内に応答を受信しなかった場合、対応する <response> ブロックで定義された割り当ては実行されません。応答自体は [破棄] ステータスとしてマーキングされます。
呼び出しが同期の場合は、<call> 要素自体の timeout 属性を使用してオプションのタイムアウトを指定できます。この属性は、非同期呼び出しでは使用できません。<call> 要素で async が 1 (真) に設定されている場合、タイムアウト時間を設定するには、非同期応答を収集する <sync> 要素の timeout 属性を使用するしか方法がありません。
下の例は、同期 Ens.StringRequestOpens in a new tab リクエストを Get Weather Report ビジネス・オペレーションに送信します。
<call name='Get Weather Report' target='Get Weather Report' async='0' >
<request type='Ens.StringRequest' >
<assign property="callrequest.StringValue" value="context.Location" action="set" />
</request>
<response type='Demo.Service.Msg.WeatherOperationResponse' >
<assign property="context.OperationReport" value="callresponse" action="set" />
</response>
</call>
以下の例では、<call> 要素を使用して、非同期の MyApp.SalaryRequest 要求を MyApp.PayrollApp ビジネス・オペレーションに送信します。
<call name="FindSalary" target="MyApp.PayrollApp" async="1">
<request type="MyApp.SalaryRequest">
<assign property="callrequest.Name" value="request.Name" />
<assign property="callrequest.SSN" value="request.SSN" />
</request>
<response type="MyApp.SalaryResponse">
<assign property="context.Salary" value="callresponse.Salary" />
</response>
</call>
<call> 要素を実行するたびに、その <call> 要素の name がメッセージ・ヘッダに挿入されるので、その後も [メッセージ・ブラウザ] や [ビジュアル・トレース] で参照できます。
ループで複数の非同期 <calls> を使用し、その後に 1 つの <sync> を指定
この節では、ループで複数の非同期 <calls> を使用し、その後に 1 つの <sync> を指定する方法を説明します。
BPL で <call> を実行すると、その呼び出しの名前が記録されます。待機対象とする保留中の要求を指定するために、その同じ名前を <sync> に指定する必要があります。シナリオによっては、次の例で示しているように、1 つのループ内に複数の非同期呼び出しを使用する場合があります。
<sequence>
<while condition='...'>
<call name="A" async="1" />
</while>
...
<sync calls="A" type="all" timeout="3600"/>
</sequence>
BPL では、呼び出し名で、待機対象の呼び出しが追跡されるため、最初の応答を受け取ってすぐに sync が実行されます。複数の非同期呼び出しすべてが完了するまで sync の実行を待機する場合は、一連の固有の呼び出し名を生成し、その名前リストを使用する必要があります。それを実行する方法は、次のとおりです。
-
数値イテレータ (以下の例では i) を追加することによって、呼び出しごとに変化する文字列が含まれるコンテキスト変数を作成します。次の例のように、呼び出しの前にこの変数を初期化します。
set context.callname = "A" _ context.i
-
<call> の Name をこの変数と同じに設定します。
-
<call> の名前すべてをカンマ区切りで含む文字列を作成します。次に例を示します。"A1,A2,A3,A4,A5"。これを別個の変数 (以下の例では context.allCallNames) に保存します。
-
<sync> の calls 属性を、呼び出しのリストを含む変数と同じに設定します。
<sequence>
<while condition='...'>
.... code here to set up callname and allCallNames ...
<call name="@context.callname" async="1" />
</while>
...
<sync calls="@context.allCallNames" type="all" timeout="3600"/>
</sequence>