ビジネス・プロセスのコンポーネントとしての使用法
ビジネス・プロセス・コンポーネントまたはBPL コンポーネントは、プログラマが BPL 言語のモジュール式の再利用可能な一連の手順として指定する BPL ビジネス・プロセスです。BPL コンポーネントは、他のプログラミング言語における関数、マクロ、サブルーチンと似ています。
別の BPL ビジネス・プロセスのみが BPL コンポーネントを呼び出すことができます。これは、BPL の <call> 要素を使用して呼び出します。BPL ビジネス・プロセス・コンポーネントは、タスクを実行すると、呼び出された BPL ビジネス・プロセスに制御を戻します。
プロダクション・アーキテクチャでは、ある BPL ビジネス・プロセスを使用して別の BPL ビジネス・プロセスを呼び出せるようになっています。オプションのコンポーネントを指定することにより、さらに便利になります。これにより、特定の BPL ビジネス・プロセスを、以下のようなより単純な下位レベルのコンポーネントに分類できます。
コンポーネントでないビジネス・プロセスは、より複雑で特殊な目的で設計され、コンポーネントより高い概念レベルで動作するものと想定されます。BPL のコンポーネント以外は、BPL コンポーネントを呼び出してタスクを実行することが想定されます。
Important:
任意の BPL ビジネス・プロセスに対して、コンポーネントの指定を使用するための要件はありません。BPL プログラマは、目的に合わせて適宜利用できます。
ビジネス・プロセスをコンポーネントに変換するには、その BPL ビジネス・プロセスに対して最上位レベルの <process> コンテナの属性を設定します。この属性は component という名前であり、その値は 1 (真) または 0 (偽) に設定できます。構文の詳細は、"ビジネス・プロセス言語およびデータ変換言語リファレンス" を参照してください。
component 属性の値を設定するには、以下のいずれかを実行します。
BPL ビジネス・プロセスからコンポーネントに対する <call> をセットアップするには、後述する “コール・アクティビティの追加” を参照してください。
ビジネス・プロセスの実行コンテキスト
ビジネス・プロセスのライフ・サイクルでは、ビジネス・プロセスが実行を中断または再開するたびに、一定のステータス情報をディスクに保存し、またディスクからリストアする必要があります。この機能は、完了までに数日または数週間かかる可能性のある長期実行のビジネス・プロセスにおいては特に重要です。
BPL ビジネス・プロセスでは、実行コンテキストと呼ばれる、変数グループを使用したビジネス・プロセスのライフ・サイクルをサポートしています。BPL ビジネス・プロセスの実行が中断および再開されるたびに、実行コンテキスト内の変数が自動的に保存およびリストアされます。これらの変数は、すべての BPL ビジネス・プロセス、つまり、Ens.BusinessProcessBPLOpens in a new tab から継承したすべてのビジネス・プロセス・クラスに使用できます。
実行コンテキスト変数には、BPL ビジネス・プロセス内のすべてのアクティビティで利用可能なものがあります。その他の変数は通常利用可能ですが、ビジネス・プロセスが実行しているアクティビティのタイプによっては、スコープ内に含まれる場合もあれば、含まれない場合もあります。以下のトピックでは、実行コンテキスト変数と、その変数が BPL ビジネス・プロセスで使用される状況について説明します。変数には、以下のものがあります。
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 のようにドット構文とメソッド名を使用します。