ビジネス・プロセスの定義
ビジネス・プロセスは、プロダクション内で高水準の処理を実行します。このページでは、ビジネス・プロセスの概要と、ビジネス・プロセス・クラスの設計方法と開発方法について説明します。
基本原理
初めに、"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 ビジネス・プロセスをアクティブ状態に戻して元の作業を再開させます。
カスタム・コードを使用する場合は、デッドロックを起こしやすいプロダクションを (誤って) 設計する可能性が高くなります。必要なことは、同期要求を送信し、限られたアクター・プールを使用するビジネス・プロセスのシーケンスを作成することです。プロダクションがアクターと同じ数のメッセージを受信し、それらすべてのメッセージに対する同期送信が同時に発生した場合、すべてのアクター・プロセスが、それとは別のプロセスによってキューからメッセージが解放されるのを待機する状態となり、プロダクションでデッドロックが発生します。この問題で最も危険なことは、デッドロックの原因となる状態をテストでは必ずしも再現できない点です。導入した後で、初めてデッドロックが発生する可能性があります。この時点では、プロダクションが動かなくなる原因がわからないので、この予期できない問題では高いコストが発生することになります。
カスタム・ビジネス・プロセスの定義
カスタム・ビジネス・プロセス・クラスを作成するには、次のようにクラスを定義します。
-
クラスは、Ens.BusinessProcessOpens in a new tab (またはサブクラス) を拡張する必要があります。
-
クラスでは、後述する 2 つの節の説明に従って、OnRequest() メソッドと OnResponse() メソッドを実装する必要があります。
-
クラスでは設定を追加または削除できます。"設定の追加と削除" を参照してください。
-
クラスは任意のまたはすべてのスタートアップ・メソッドおよびティアダウン・メソッドを実装できます。"開始動作と停止動作の上書き" を参照してください。
-
クラスにはその内部で作業を完了するためのメソッドを含めることができます。
OnRequest() メソッドの実装
カスタム・ビジネス・プロセス・クラスは OnRequest() メソッドを実装する必要があります。プロダクションは、特定のビジネス・プロセスに関する最初の要求が適切なキューに到着して、実行すべきジョブが割り当てられるたびに、このメソッドを呼び出します。
このメソッドには、以下のシグニチャがあります。
method OnRequest(request As %Library.Persistent, Output response As %Library.Persistent) as %Status
説明 :
例
以下は 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
}