6 デシジョン関数の使用
デシジョン関数を使用して、Javaアプリケーション、コンポジットまたはBPELプロセスからルールをコールできます。
6.1 デシジョン関数の概要
デシジョン関数は、呼び出すと、指定されたルールセットまたは他のデシジョン関数を適用することで、入力に基づいて出力に到達できる実行のモジュールです。
デシジョン関数には次の宣言が含まれています。
-
入力ファクト。
-
ルールセットおよびネストしたデシジョン関数。
-
出力ファクト。
デシジョン関数では、次の操作が実行されます。
-
Oracle Business Rules Engineの作業メモリーに入力をルール・ファクトとしてアサートします。
-
現在のデシジョン関数およびネストしたデシジョン関数で構成されたルールセットを順番に実行します。
-
Oracle Business Rules Engineの作業メモリーから出力ファクトを返します。
デシジョン関数を作成して、JavaアプリケーションやBPELプロセスからOracle Business Rulesを簡単に使用できます。デシジョン関数では、使用するルールを複数のルールセットとして編成し、ルールセットを規定の順序で実行できます。ファクトは最初のルールセットに進み、このルールセットで2番目以降のルールセットに進む追加のファクトをアサートでき、最後にデシジョン関数の出力としてデシジョン関数に戻ります。
6.2 デシジョン関数の使用
デシジョン関数を追加するにはルール・デザイナを使用します。
デシジョン関数を追加するには:
6.2.1 既存のデシジョン関数を編集する方法
既存のデシジョン関数を編集するには:
- ルール・デザイナで、「デシジョン関数」タブをクリックします。
- 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
- デシジョン関数を追加する場合と同様に、適切なデシジョン関数のフィールドを編集します。
6.2.2 入力の順序を変更する方法
入力の順序を変更するには:
- ルール・デザイナで、「デシジョン関数」タブをクリックします。
- 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
- 移動する入力引数を選択します。「上に移動」または「下に移動」をクリックして、入力引数の順序を変更します。
6.2.3 出力の順序を変更する方法
出力の順序を変更するには:
- ルール・デザイナで、「デシジョン関数」タブをクリックします。
- 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
- 移動する出力引数を選択します。「上に移動」または「下に移動」をクリックして、出力引数の順序を変更します。
6.3 ルール・デバッグ用の「ルール起動制限」オプションに関する必須情報
「ルール起動制限」では、実行時に許可されるステップ(ルール起動)の最大数を設定できます。
このオプションを使用して「無制限」以外の値を指定すると、特定のルールの設計問題をデバッグしたり、場合によっては実行時のjava.lang.OutOfMemoryError
エラーを防止できます。これは、無限に再帰するルール起動をデバッグするときに役立ちます。
無制限以外の値を選択し、「ルール起動制限がエラー」を選択した場合、制限に到達するとシステムがエラーをスローします。
6.4 デシジョン関数の引数に関する必須情報
Oracle Business Rulesでは、デシジョン関数ごとに対応するRL Language関数が生成されます。
生成されたデシジョン関数のシグネチャは次のようになります。
function <name>(InputFactType1 input1, ... InputFactTypeN inputN) returns List
デシジョン関数では、次のように、デシジョン関数の入力の「リスト」オプションに応じて各パラメータが生成されます。
-
入力引数の「リスト」オプションが選択されていない場合: FactTypei。入力をシングル・オブジェクトにする必要があり、アサーションはそのシングル入力オブジェクトにのみ適用されます。
-
入力の「リスト」オプションが選択されている場合: List<FactTypei>の場合、入力をオブジェクトの
List
にする必要があり、アサーションは入力のList
(java.util.List
)の各オブジェクトに適用されます
生成されたRL Language関数には、デシジョン関数の入力オプション「ツリー」
に応じて、引数ごとにassert
またはassertTreeへのコールが含まれています。「ツリー」がクリアされている場合、入力はassert
関数を使用してアサートされます。「ツリー」が選択されている場合、入力はassertTree
関数を使用してアサートされます。選択すると、ルート・オブジェクトが参照するすべてのオブジェクトがアサートされます。
「ルールセットおよびデシジョン関数」領域の「選択済」ボックスで指定されたデシジョン関数の選択済ルールセットについて、生成されたRL Language関数には、選択されたルールセットのスタック順序に従って選択済ルールセットを指定したrun()
へのコールが含まれています。
生成されたRL Language関数はリストを返します。このリストには、デシジョン関数の各出力の要素が順番に含まれています。出力がリストとして宣言された場合、対応する要素はリストになります。しかし、出力がリストとして宣言されていない場合、対応する要素は出力ファクトまたはnull(宣言されたタイプの出力ファクトが存在しない場合)になります。出力がリストとして宣言されていないときに、Oracle Business Rules Engineの作業メモリー内に指定したタイプの出力ファクトが複数見つかった場合は、例外がスローされます。
デシジョン関数を編集した後(入力と出力の変更、追加など)、変更内容は新規ビジネス・ルール・アクティビティについてBPELで参照可能になります。ただし、既存のビジネス・ルール・アクティビティでは変更内容を参照できません。詳細は、Oracle SOA SuiteでのSOAアプリケーションの開発のOracle Business Rulesのスタート・ガイドを参照してください。
6.5 デシジョン関数の「ステートレス」オプションに関する必須情報
デシジョン関数は、ステートフル操作またはステートレス操作をサポートしています。「デシジョン関数の編集」ダイアログの「ステートレス」チェック・ボックスを使用して、これらの2つの操作モードを切り替えることができます。
デフォルトでは、「ステートレス」チェック・ボックスが選択されており、ステートレス操作を示しています。ステートレス操作では、実行時に、デシジョン関数の起動が終わるたびにルール・セッションが解放されます。
「ステートレス」をクリアすると、基礎となるOracle Business Rulesオブジェクトはビジネス・ルール・サービス・エンジンのメモリーに保管されるため、操作の終了時にルール・セッション・プールに戻されません。これ以降にデシジョン関数を使用すると、キャッシュされているRuleSessionオブジェクトが再利用され、そのすべての状態情報が前回の起動から取得されます。したがって、「ステートレス」をクリアすると、ルール・セッションは以降のリクエストのために保存され、同じプロセスからの一連のデシジョン関数の起動は常にステートレス起動で終了します。