Skip to main content

BPL (実行コンテキスト) で使用可能な変数

ここでは、BPL ビジネス・プロセス内で使用可能な変数について説明します。

Tip:

<process>、<context>、<call> などの BPL 要素の BPL 構文に関する詳細は、"ビジネス・プロセス言語およびデータ変換言語リファレンス" を参照してください。これには、コンテキスト変数の参照情報も記載されています。

概要

ビジネス・プロセスのライフ・サイクルでは、ビジネス・プロセスが実行を中断または再開するたびに、一定のステータス情報をディスクに保存し、またディスクからリストアする必要があります。この機能は、完了までに数日または数週間かかる可能性のある長期実行のビジネス・プロセスにおいては特に重要です。

BPL ビジネス・プロセスでは、実行コンテキストと呼ばれる、変数グループを使用したビジネス・プロセスのライフ・サイクルをサポートしています。BPL ビジネス・プロセスの実行が中断および再開されるたびに、実行コンテキスト内の変数が自動的に保存およびリストアされます。これらの変数は、すべての BPL ビジネス・プロセス、つまり、Ens.BusinessProcessBPLOpens in a new tab から継承したすべてのビジネス・プロセス・クラスに使用できます。

実行コンテキスト変数には、BPL ビジネス・プロセス内のすべてのアクティビティで利用可能なものがあります。その他の変数は通常利用可能ですが、ビジネス・プロセスが実行しているアクティビティのタイプによっては、スコープ内に含まれる場合もあれば、含まれない場合もあります。

Important:

Ens.BusinessProcessOpens in a new tab から継承したカスタム・ビジネス・プロセスは、組み込みの実行コンテキストにアクセスできないため、カスタム・コードを使用して同様の処理を実行する必要があります。

context オブジェクト

context オブジェクトは、<process> 要素内の任意の箇所で BPL ビジネス・プロセスによって使用可能です。context は、ビジネス・プロセスのライフ・サイクル中に永続化される必要のある任意のデータ用の汎用コンテナです。BPL ビジネス・プロセスの作成時に、各データ項目を context オブジェクト上のプロパティとして定義します。推奨手順は、"context オブジェクトの定義" を参照してください。

context オブジェクト上のプロパティを定義したら、通常のドット構文と対象のプロパティ名を使用して、BPL 内のどこからでもそれらのプロパティを参照できます (例 : context.MyData)。

request オブジェクト

request オブジェクトには、元の要求メッセージ・オブジェクトに含まれていたプロパティが格納されています。元の要求メッセージ・オブジェクトとは、このビジネス・プロセスを最初にインスタンス化させた受信メッセージです。これは基本要求と呼ばれます。

request オブジェクトは、<process> 要素内であれば、BPL ビジネス・プロセスによって使用できます。request オブジェクトのプロパティを参照するには、request.OriginalThought のようにドット構文とプロパティ名を使用します。

response オブジェクト

response オブジェクトには、ビジネス・プロセス・インスタンスが返す最終的な応答メッセージ・オブジェクトを構築するのに必要なプロパティが含まれます。ビジネス・プロセスは、ライフ・サイクルの最後に達したとき、または <reply> アクティビティを検出したときに、この最終的な応答を返します。

response オブジェクトは、<process> 要素内であれば、BPL ビジネス・プロセスによって使用できます。response オブジェクトのプロパティを参照するには、response.BottomLine のようにドット構文とパラメータ名を使用します。

callrequest オブジェクト

callrequest オブジェクトには、<call> で送信する要求メッセージ・オブジェクトを作成する際に必要となるすべてのプロパティが含まれます。

<call> アクティビティは、要求メッセージを送信し、必要に応じて応答を受信します。BPL <call> 要素には、要求メッセージ・オブジェクトのプロパティに値を挿入する <request> アクティビティが含まれている必要があります。そのため、<request> には、callrequest オブジェクトのプロパティに値を挿入する一連の <assign> アクティビティが用意されています。これらの値には、通常、元の request オブジェクトのプロパティ値が使用されますが、任意の値を割り当てることができます。

<request> 内の <assign> アクティビティが完了すると、すぐにメッセージが送信され、関連付けられた callrequest オブジェクトはスコープから外れます。callrequest は、関連付けられた <request> アクティビティの外部では意味を持たないため、関連付けられた <call> が次のアクティビティであるオプションの <response> の処理を開始するときには、既にスコープから外れています。

関連する <request> 要素のスコープ内であれば、callrequest.UserData のようにドット構文を使用して、callrequest のプロパティを参照できます。

callresponse オブジェクト

<call> アクティビティが完了すると、callresponse オブジェクトには、<call> に返された応答メッセージ・オブジェクトのプロパティが追加されます。<call> が応答を待たないアクティビティとして設計されていた場合、callresponse はありません。同様に、<sync> を使用して応答を待っていても、<sync> 要素で指定されたタイムアウト期間内に応答が返ってこなかった場合は、callresponse が存在しません。

応答を待つ <call> はすべて、<call> 内に <response> アクティビティが存在している必要があります。<response> アクティビティの目的は、応答値を取得し、それをビジネス・プロセス全体で使用できるようにすることです。callresponse オブジェクトは、<response> アクティビティ内であればどこでも使用できます。ただし、<response> アクティビティが完了した時点で、関連する callresponse オブジェクトはスコープから外れます。そのため、ビジネス・プロセスの他の場所で callresponse の値を使用する場合は、その値に対して context オブジェクトまたは response オブジェクトのプロパティへの <assign> を実行し、値を受信した <response> アクティビティが完了するまでに、この処理を実行する必要があります。

callresponse のプロパティを参照するには、callresponse.UserAnswer のようにドット構文を使用します。

syncresponses コレクション

syncresponses は、<sync> によって同期化された <call> アクティビティの名前をキーとするコレクションです。

<sync> アクティビティが開始されると、新しい応答に備えて、syncresponses が消去されます。<call> アクティビティが返されると、応答がコレクションに格納されます。<sync> アクティビティが完了すると、syncresponses には、必要な応答のすべてまたは一部が格納されるか、何も格納されません (synctimedout を参照してください)。syncresponses は、関連する <call> および <sync> アクティビティが含まれた <sequence> の内部であれば使用できますが、<sequence> の外部ではスコープから外れます。

同期化された呼び出しの 1 つから応答値を参照するには、構文 syncresponses.GetAt("name") を使用します。

ここで、関連する <call> は <call name="name"> と定義されます。

synctimedout 値

synctimedout は 0、1、または 2 の値を取る整数値です。synctimedout は、いくつかの呼び出し後の <sync> アクティビティの結果を示します。synctimedout の値をテストできるのは、<sync> の後から、該当する呼び出しと <sync> を含む <sequence> の直前までです。synctimedout の値は、以下の 3 つのいずれかになります。

  • 0 の場合、どの呼び出しもタイムアウトになっていません。すべての呼び出しが時間内に完了しました。<sync> アクティビティに timeout が設定されていない場合も、この値が返されます。

  • 1 の場合、1 つ以上の呼び出しがタイムアウトになりました。つまり、時間切れのため、完了できなかった <call> アクティビティがあります。

  • 2 の場合、1 つ以上の呼び出しが中断されました。

synctimedout は、関連する <call> アクティビティと <sync> アクティビティが含まれた <sequence> の内部であれば、BPL ビジネス・プロセスに使用できますが、<sequence> の外部では、スコープから外れます。通常、synctimedout を取得してステータスを確認し、その後、syncresponses コレクションの完了した呼び出しから応答を取得します。synctimedout を参照するには、synctimedout のように、整数の変数名と同じ構文を使用します。

status 値

status は、成功または失敗を示す %StatusOpens in a new tab 型の値です。

Note:

BPL ビジネス・プロセスのエラー処理は自動的に実行されます。BPL ソース・コードで status 値をテストまたは設定する必要はありません。ここでは、特殊な状況下で BPL ビジネス・プロセスを終了しなければならない場合に備えて、status 値が設けられています。

BPL ビジネス・プロセスが開始されると、status には成功を示す値が自動的に割り当てられます。status に成功値が割り当てられているかどうかを確認するには、ObjectScript ではマクロ $$$ISOK(status) を使用します。このテストで True 値が返された場合、status には成功値が格納されています。

BPL ビジネス・プロセスの実行中に status が失敗値を受け取ると、そのビジネス・プロセスは即座に終了し、該当するテキスト・メッセージがイベント・ログに書き込まれます。この処理は、status がどのような状況で失敗値を受け取ったかにかかわらず実行されます。したがって、status に失敗値を設定すれば、BPL ビジネス・プロセスをいつでも正常に終了することができます。

status では、以下のいずれかの方法で失敗値を取得できます。

  • status は、ビジネス・プロセスが別のビジネス・ホストに対して実行した任意の <call> から返された %StatusOpens in a new tab 値を自動的に受け取ります。この %StatusOpens in a new tab の値が失敗を示す場合、status には自動的にその失敗値が入ります。これは、status を設定する最も一般的な方法で、BPL コードで特別な文を使用しなくても、自動的に処理されます。

  • <assign> アクティビティで、status を失敗値に設定できます。そのために、一般的には <if> 要素を使用して前のアクティビティの結果をテストし、<true> 要素または <false> 要素の中で <assign> を使用して失敗条件が存在すれば status を失敗値に設定します。

  • <code> アクティビティ内の文では、status を失敗値に設定できます。<code> アクティビティがすべて完了するまで、BPL ビジネス・プロセスは status 値の変更を認識しません。したがって、status が失敗の場合に <code> アクティビティを即座に終了するには、status に失敗値を設定した直後に、<code> アクティビティ内に終了コマンドを配置する必要があります。

status に失敗値が割り当てられているかどうかを確認するには、ObjectScript ではマクロ $$$ISERR(status) を使用します。このテストで True 値が返された場合、status には失敗値が格納されています。このテストは、メイン BPL ビジネス・プロセスに戻る前に <code> アクティビティの本体内でのみ実行できます。ビジネス・プロセスは任意の <call>、<assign>、または <code> アクティビティの後に status で失敗値を取得したことを検出すると、自動的にエラーで終了してしまいます。

BPL ビジネス・プロセスでは、<process> 内であればどこでも status を使用できます。status を参照するための構文は、%StatusOpens in a new tab 型の変数の場合と同じです。つまり status となります。

Caution:

その他すべての実行コンテキスト変数名と同様、status は BPL の予約語です。上記の場合を除き、この予約語を使用しないでください。

process オブジェクト

process オブジェクトは、BPL ビジネス・プロセス・オブジェクトの現在のインスタンスを表します。process オブジェクトの目的は、BPL ビジネス・プロセスのフロー内の任意のコンテキストから (例えば、<code> アクティビティのテキスト・ブロック内から)、SendRequestSync()SendRequestAsync() などの任意のビジネス・プロセス・メソッドを呼び出せるようにすることです。

process オブジェクトは、<process> 要素内であれば、BPL ビジネス・プロセスで使用できますが、一般的には <code> アクティビティ内でのみ必要になります。process オブジェクトのメソッドを参照するには、process.SendRequestSync()process.ClearAllPendingResponses のようにドット構文とメソッド名を使用します。

FeedbackOpens in a new tab