ビジネス・プロセスの定義
ビジネス・プロセスは、プロダクション内で高水準の処理を実行します。このページでは、ビジネス・プロセスの概要と、ビジネス・プロセス・クラスの設計方法と開発方法について説明します。
概要
慣例により、ビジネス・プロセスにはプロダクションのほとんどのロジックが含まれています。これらは、独自のロジックを含むことができ、同様にそれぞれが特殊なロジックを含むビジネス・ルールとデータ変換を呼び出すことができます。下の図は、この様子を示しています。
この図には要求メッセージしか描かれていないことに注意してください。
ビジネス・プロセスにはさまざまな用途があります。時には、1 つのビジネス・プロセスが 1 つ以上の外部アプリケーション内の一連のアクションを調整する場合があります。このプロセスは、処理を決定するロジックが組み込まれており、必要に応じて、ビジネス・オペレーションまたは他のビジネス・プロセスを呼び出します。ビジネス・プロセスにはユーザ操作を含めることもできます。詳細は、"ワークフローの開発" を参照してください。
InterSystems IRIS® には、以下の汎用タイプのビジネス・プロセスが用意されています。
-
Ens.BusinessProcessBPLOpens in a new tab クラスを基本とする BPL プロセス。
BPL プロセスのみがビジネス・プロセス実行コンテキストと、ロジックのグラフィック表示をサポートします。
-
EnsLib.MsgRouter.RoutingEngineOpens in a new tab クラスまたは EnsLib.MsgRouter.VDocRoutingEngineOpens in a new tab クラスを基本とするルーティング・プロセス。
InterSystems IRIS には、特定の種類のメッセージをルーティングする一連のクラスが用意されています。これらのサブクラスを使用するために、通常、コーディングの必要はありません。これらのクラスに関するドキュメントのリストは、"相互運用プロダクションの概要" の "ビジネス・プロセスのタイプ" を参照してください。
-
Ens.BusinessProcessOpens in a new tab クラスを基本とする カスタム・ビジネス・プロセス。
プロダクションにはこれらのビジネス・プロセスを混在させることができます。
Ens.BusinessProcessBPLOpens in a new tab、EnsLib.MsgRouter.RoutingEngineOpens in a new tab、および EnsLib.MsgRouter.VDocRoutingEngineOpens in a new tab はすべて Ens.BusinessProcessOpens in a new tab を基本とすることに注意してください。
ビジネス・ロジック・ツールの比較
ビジネス・プロセスは、使用するデータ変換やビジネス・ルールと一緒に開発することになります。データ変換とビジネス・ルールの目的は、次のような特定のロジックを組み込むことです。
-
データ変換でメッセージを変更する
-
ビジネス・ルールで値を返したり、メッセージの送信先を指定したりする (この両方を行う場合もある)
ただし、ビジネス・プロセス、データ変換、およびビジネス・ルールで使用可能なオプションが重複しています。これらの項目の作成方法を判断しやすくするために、下の表にこれらの比較を示します。BPL (最も一般的なビジネス・プロセス)、DTL (最も一般的なデータ変換)、およびビジネス・ルールが比較されています。
オプション | BPL でのサポート | DTL でのサポート | ビジネス・ルールでのサポート |
---|---|---|---|
ビジネス・プロセスに関する情報の取得 | あり (ビジネス実行コンテキスト変数) | なし | なし |
値の割り当て | あり (<assign>) | あり (assign アクション) | あり (assign アクション) |
データ変換の呼び出し | あり (<transform>) | あり (subtransform アクション) | あり (send アクション) |
ビジネス・ルールの呼び出し | あり (<call>) | なし | あり (delegate アクション) |
カスタム・コードの呼び出し | あり (<code>) | あり (code アクション) | なし |
SQL の呼び出し | あり (<sql>) | あり (sql アクション) | なし |
条件付きロジック | あり (<if>、<switch>、<branch>) | あり (if アクション) | なし |
ループ処理 | あり (<foreach>、<while>、<until>) | あり (for each アクション ) | なし |
アラートの送信 | あり (<alert>) | なし | なし |
トレース要素の追加 | あり (<trace>) | あり (trace アクション) | あり (trace アクション) |
ビジネス・オペレーションまたはプロセスへの要求メッセージの送信 | あり (<call>) | なし | あり (send アクション) |
非同期要求からの応答の待機 | あり (<sync>) | なし | なし |
メッセージの削除 | なし | なし | あり (delete アクション) |
エラー処理の実行 | あり (<throw>、<catch> など) | なし | なし |
指定された期間または将来の特定の時刻までの実行の延期 | あり (<delay>) | なし | なし |
実行完了前の初期応答の送信 | あり (<reply>) | なし | なし |
XPATH と XSLT の使用 | あり (<xpath>、<xslt>) | なし | なし |
マイルストーンを認識するための一時的なメッセージの保存 | あり (<milestone>) | なし | なし |
DTL 変換とビジネス・ルールの詳細は、"DTL 変換の開発" と "ビジネス・ルールの開発" を参照してください。
基本原理
初めに、"InterSystems IRIS のプログラミング" を参照してください。
ビジネス・プロセスを開発する場合は、以下の基本原理を考慮してください。
-
応答オブジェクトは受信要求オブジェクトの変更バージョンにした方が望ましい場合があり、変更は段階的に行った方が有効な場合があります。ただし、受信要求オブジェクトは変更しないでください。代わりに、それをコンテキスト変数にコピーします (または、カスタム・ビジネス・プロセスの場合は、データをローカル変数にコピーします)。その後で、そのコピーを変更します。
-
メッセージを同期的に送信する場合は注意が必要です (カスタム・ビジネス・プロセスまたは BPL 内の <code> でしか実行できません)。
ビジネス・プロセス A がビジネス・プロセス B を同期的に呼び出す場合、プロセス A は応答を受け取るまで先に進めません。プロセス A がそれ自体を完了するために他のプロセス (B) への呼び出しを完了する必要がある場合とそれらのプロセスがアクター・ジョブのプールを共有している場合は、呼び出されたビジネス・プロセス (B) を処理する空きアクター・ジョブが存在しなければ、アクター・プールがデッドロックする可能性があります。
この現象は、呼び出し元のビジネス・プロセスは呼び出し先のビジネス・プロセスが復帰するまでアクター・ジョブを完了して解放することができないが、実行する空きアクター・ジョブが存在しないことから、呼び出し先のビジネス・プロセスが実行できないために発生します。
また、InterSystems IRIS は真の同期呼び出し中はシャットダウンできないことに注意してください。
SendRequestAsync() を使用して、OnResponse() メソッド内の応答メッセージを処理するほうが適切です。同期的に呼び出す必要がある場合は、呼び出し先のビジネス・プロセス (B) で独自のジョブ・プールが使用されるように構成することで、この問題を回避できます。
-
単一ジョブ・ビジネス・プロセスが要求を発行して応答を待っている場合は、このプロセスから FIFO 機能が失われます。
BPL からの同期呼び出しはコンパイラによって非同期的に実装されるため、ビジネス・プロセスは呼び出し発行後にディスクに移動することになります。そうすれば、アクターは、新たなビジネス・プロセスまたは他のビジネス・プロセスへの応答をキューから除去し続けることができます。
FIFO 処理は、応答の必要な要求を呼び出さない単一ジョブ・ビジネス・プロセスにのみ許可されます。ビジネス・プロセスが呼び出しの実行後も FIFO を維持する場合は、SendRequestSync() を呼び出す <code> アクティビティを使用する必要があります。ただし、その場合は、前述の箇条書き項目が適用されます。
-
BPL は、競合やデッドロックに伴う一般的な問題を回避する合理的な整然とした方法で同期メッセージングと非同期メッセージングのすべての側面を処理することにより、大きなメリットを提供します。同期を指定した呼び出しであっても、待機時間が発生すると、プロダクション・フレームワークは BPL ビジネス・プロセスのために呼び出しを実行したジョブを暗黙のうちに解放し、BPL が同期応答を待機している間にそのジョブで他の作業ができるようにします。その後、Ensemble フレームワークは暗黙のうちに同期応答の受信を調整し、BPL ビジネス・プロセスをアクティブ状態に戻して元の作業を再開させます。
カスタム・コードを使用する場合は、デッドロックを起こしやすいプロダクションを (誤って) 設計する可能性が高くなります。必要なことは、同期要求を送信し、限られたアクター・プールを使用するビジネス・プロセスのシーケンスを作成することです。プロダクションがアクターと同じ数のメッセージを受信し、それらすべてのメッセージに対する同期送信が同時に発生した場合、すべてのアクター・プロセスが、それとは別のプロセスによってキューからメッセージが解放されるのを待機する状態となり、プロダクションでデッドロックが発生します。この問題で最も危険なことは、デッドロックの原因となる状態をテストでは必ずしも再現できない点です。導入した後で、初めてデッドロックが発生する可能性があります。この時点では、プロダクションが動かなくなる原因がわからないので、この予期できない問題では高いコストが発生することになります。
BPL ビジネス・プロセスの定義
BPL ビジネス・プロセスは Ens.BusinessProcessBPLOpens in a new tab を基本とするクラスです。この場合は、管理ポータルまたは IDE でプロセスを視覚的に作成および編集できます。詳細は、"BPL プロセスの開発" を参照してください。
カスタム・ビジネス・プロセスの定義
カスタム・ビジネス・プロセス・クラスを作成するには、次のようにクラスを定義します。
-
クラスは、Ens.BusinessProcessOpens in a new tab (またはサブクラス) を拡張する必要があります。
-
クラスでは、後述する 2 つの節の説明に従って、OnRequest() メソッドと OnResponse() メソッドを実装する必要があります。
-
クラスでは設定を追加または削除できます。"設定の追加と削除" を参照してください。
-
クラスは任意のまたはすべてのスタートアップ・メソッドおよびティアダウン・メソッドを実装できます。"開始動作と停止動作の上書き" を参照してください。
-
クラスにはその内部で作業を完了するためのメソッドを含めることができます。
OnRequest() メソッドの実装
カスタム・ビジネス・プロセス・クラスは OnRequest() メソッドを実装する必要があります。プロダクションは、特定のビジネス・プロセスに関する最初の要求が適切なキューに到着して、実行すべきジョブが割り当てられるたびに、このメソッドを呼び出します。
このメソッドには、以下のシグニチャがあります。
method OnRequest(request As %Library.Persistent, Output response As %Library.Persistent) as %Status
説明 :
-
request — 受信要求オブジェクトです。
-
response — このビジネス・プロセスによって返される応答です。
例
以下は OnRequest() メソッドの例です。
Method OnRequest(request As Demo.Loan.Msg.Application, Output response As Demo.Loan.Msg.Approval)
As %Status
{
Set tSC=$$$OK
$$$TRACE("received application for "_request.Name)
#;
If $zcrc(request.Name,2)#5=0 {
Set tRequest = ##class(Demo.Loan.Msg.PrimeRateRequest).%New()
Set tSC =..SendRequestAsync("Demo.Loan.WebOperations",tRequest,1,"PrimeRate")
If $$$ISOK(tSC){
Set tRequest = ##class(Demo.Loan.Msg.CreditRatingRequest).%New()
Set tRequest.SSN = request.SSN
Set tSC =..SendRequestAsync("Demo.Loan.WebOperations",tRequest,1,"CreditRating")
If $$$ISOK(tSC){
Set tSC = ..SetTimer("PT15S")
}
}
} Else {
Set response = ##class(Demo.Loan.Msg.Approval).%New()
Set response.BankName = "BankUS"
Set response.IsApproved = 0
$$$TRACE("application is denied because of bank holiday")
}
Return tSC
}
OnResponse() メソッドの実装
カスタム・ビジネス・プロセス・クラスは OnResponse() メソッドを実装する必要があります。プロダクションは、特定のビジネス・プロセスに関する応答が適切なキューに到着して、実行すべきジョブが割り当てられるたびに、このメソッドを呼び出します。通常、これは、ビジネス・プロセスが生成した非同期の要求に対する応答です。
このメソッドには、以下のシグニチャがあります。
method OnResponse(request As %Library.Persistent,
ByRef response As %Library.Persistent,
callrequest As %Library.Persistent,
callresponse As %Library.Persistent,
pCompletionKey As %String) as %Status
このメソッドは、以下の引数を取ります。
-
request — このビジネス・プロセスに送信される最初の要求オブジェクトです。
-
response — このビジネス・プロセスによって最終的に返される応答オブジェクトです。
-
callrequest — 受信応答と関連付けられた要求オブジェクトです。
-
callresponse — 受信応答オブジェクトです。
-
pCompletionKey — 受信応答と関連付けられた完了を示すキー値です。この値は、要求を生成した SendRequestAsync() メソッドを呼び出すことで設定されます。
例
以下は OnResponse() メソッドの例です。
/// Handle a 'Response'
Method OnResponse(request As Ens.Request,
ByRef response As Ens.Response,
callrequest As Ens.Request,
callresponse As Ens.Response,
pCompletionKey As %String) As %Status
{
Set tSC=$$$OK
If pCompletionKey="PrimeRate" {
Set ..PrimeRate = callresponse.PrimeRate
} Elseif pCompletionKey="CreditRating" {
Set ..CreditRating = callresponse.CreditRating
}
Return tSC
}
OnRequest() と OnResponse() 内で使用するメソッド
OnRequest() と OnResponse() を実装するときに、Ens.BusinessProcessOpens in a new tab クラスの以下のメソッドを使用できます。
-
SendRequestSync()Opens in a new tab
ただし、"基本原理" を参照してください。
これらのメソッドの詳細は、Ens.BusinessProcessOpens in a new tab に関する "クラス・リファレンス" を参照してください。