<call>
構文
<call name="Call" target="MyApp.MyOperation" async="1">
<request type="MyApp.Request">
...
</request>
<response type="MyApp.Response">
...
</response>
</call>
詳細
ここに別途指定のない限り、各属性は必須です。
属性または要素 | 説明 | 値 |
---|---|---|
name 属性 | 必須項目。<call> 要素の名前。リテラル文字列として指定するか、または @ 間接演算子でコンテキスト変数の値を参照することによって指定します。
<sync> 要素を使用して非同期呼び出しから応答を取得する場合は、name を使用して <sync> 要素を参照します。 |
1 ~ 255 文字の文字列 |
target 属性 | 必須項目。要求の送信先であるビジネス・オペレーションまたはビジネス・プロセスの構成名。この値は、リテラル文字列として指定するか、または @ 間接演算子でコンテキスト変数の値を参照することによって指定します。 | 1 文字以上の文字列 |
async 属性 | 必須項目。作成する要求のタイプを指定します。1 (真) のとき、要求は非同期になります。0 (偽) のとき、要求は同期します。 | 1 (真) または 0 (偽) |
timeout 属性 | オプション。同期呼び出しのタイムアウトを設定します。<call> の async 属性が 0 (偽) に設定されている場合のみ、timeout 値を使用します。応答を待機する秒数を、XML の xsd:dateTime 型の値を求める式として指定します。 | 1 文字以上の文字列 (2023:10:19T10:10 など) |
disabled、xpos、ypos、xend、yend 属性 | "一般的な属性と要素" を参照してください。 | |
<annotation> 要素 | ||
<request> 要素 | 必須項目。送信する要求のタイプ (クラス名) を指定します。 | |
<response> 要素 | オプション。返す応答のタイプ (クラス名) を指定します。指定しない場合は、この <call> から応答が返されません。 |
説明
<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> 要素を使用します。
非同期要求の場合、<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 がメッセージ・ヘッダに挿入されるので、その後も [メッセージ・ブラウザ] や [ビジュアル・トレース] で参照できます。
<assign> 要素の使用
上記の例には、context、request、callrequest、callresponse など、ビジネス・プロセスの実行コンテキストの変数のプロパティを操作する <assign> 要素が含まれています。これらの変数については <assign> 要素のドキュメントで詳しく説明されていますが、以下の表では、<call> アクティビティに関連する実行コンテキスト変数について説明します。
<call> 要素は以下の変数とそのプロパティを参照できます。このリストに示されていない変数を使用しないでください。
変数 | 目的 |
---|---|
callrequest | <call> 要素には、ターゲットに送信するメッセージのタイプを指定する <request> 要素が含まれます。このタイプのメッセージに入力パラメータがある場合、<request> 要素で <assign> 要素を使用し、callrequest オブジェクトのプロパティに値を割り当てる必要があります。これらのプロパティは、このメッセージ・タイプの入力パラメータと一致している必要があります。<request> が完了すると、callrequest オブジェクトはスコープから外れます。 |
callresponse | 要求メッセージ・タイプに対応する応答メッセージ・タイプがある場合、<call> 要素には <response> 要素が含まれます。応答を受け取ると、<response> 要素に制御が渡されます。応答メッセージからの出力パラメータは、callresponse オブジェクトのプロパティとなります。callresponse は <response> 要素内でのみ有効です。したがって、これらの値を保持するには、<response> 要素内で <assign> 要素を使用して、ビジネス・プロセスの実行コンテキストのより永続的なオブジェクト (通常は context または response) のプロパティに、callresponse の値を割り当てる必要があります。 |
context | ビジネス・プロセスの実行中、context オブジェクトは、保持する必要のあるビジネス・プロセス・データの汎用コンテナとして機能します。 |
request | ビジネス・プロセスの実行中、request オブジェクトには、ビジネス・プロセスに送信された元のプロパティが、そのビジネス・プロセスをインスタンス化した要求のパラメータとして格納されます。 |
response | ビジネス・プロセスの実行中、response オブジェクトにはそのスコープが保持されます。このオブジェクトは、このビジネス・プロセスの出力パラメータとして呼び出し元に返されるべきプロパティを保持します。ビジネス・プロセスの完了時または終了時には、response オブジェクト内のプロパティがそのビジネス・プロセスの戻り値として解釈されます。 |
status | status は、成功または失敗を示す %StatusOpens in a new tab 値です。BPL ビジネス・プロセスが開始されると、status には成功を示す値が自動的に割り当てられます。BPL ビジネス・プロセスの実行中に status が失敗値を受け取ると、そのビジネス・プロセスは即座に終了し、対応するテキスト・メッセージがイベント・ログに書き込まれます。status は、BPL コードに特別な文がなくても、<call> アクティビティから返された %StatusOpens in a new tab の値を自動的に受け取ります。そのため、いずれかの <call> アクティビティが失敗した場合は、BPL ビジネス・プロセスが即座に終了して、イベント・ログ・エントリが書き込まれます。 |
syncresponses | syncresponses は応答オブジェクトのコレクションであり、同期している <call> アクティビティの名前がキーとなります。完了した呼び出しのみが示されます。syncresponses から応答を取得できるのは、<sync> を実行してから、現在の <sequence> の終了までの間に限られます。該当する呼び出しが <call name="MyName"> として定義されている syncresponses.GetAt("MyName") 構文を使用して応答を取得します。 |
synctimedout | synctimedout 値は整数です。synctimedout は、いくつかの呼び出し後の <sync> アクティビティの結果を示します。synctimedout の値をテストできるのは、<sync> を実行してから、該当する呼び出しと <sync> を含む <sequence> の終了までです。synctimedout の値は、以下の 3 つのいずれかになります。
通常、synctimedout を取得してステータスを確認し、その後、syncresponses コレクションの完了した呼び出しから応答を取得します。 |
その他すべての実行コンテキスト変数名と同様、status は BPL の予約語です。このテーブルで説明されている以外の用途では使用しないでください。
name 属性または target 属性の間接指定 (コンテキスト変数へのアクセス)
name 属性または target 属性の値は文字列です。name は呼び出しを識別し、その後、<sync> 要素で参照することができます。target は、要求の送信先であるビジネス・オペレーションまたはビジネス・プロセスの構成名です。どちらの文字列もリテラル値にすることができます。
<call name="Call" target="MyApp.MyOperation" async="1">
また、次のように @ 間接演算子を使用して、適切な文字列を含むコンテキスト変数の値にアクセスすることもできます。
<call name="@context.nextCallName" target="@context.nextBusinessHost" async="1">
ループで複数の非同期 <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>