デシジョン関数を使用して、Javaアプリケーション、コンポジットまたはBPELプロセスからルールをコールできます。
この章の内容は次のとおりです。
デシジョン関数は、宣言的に構成される関数です。 デシジョン関数では、次の操作が実行されます。
ルールセットとその他のデシジョン関数が単一の実行可能な集合となるように収集されます。
Oracle Business Rules Engineの作業メモリーへの入力のアサーションがルールのファクトとして処理されます。
結果的に実行されるアクションが収集されます。
ルールセットが実行されます。
結果が戻されます。
デシジョン関数を作成して、JavaアプリケーションやBPELプロセスからOracle Business Rulesを簡単に使用できます。 デシジョン関数では、使用するルールを複数のルールセットとして編成し、ルールセットを規定の順序で実行できます。 ファクトは最初のルールセットに進み、このルールセットで2番目以降のルールセットに進む追加のファクトをアサートでき、最後にデシジョン関数の出力としてデシジョン関数に戻ります。
デシジョン関数を追加するにはRules Designerを使用します。
デシジョン関数を追加する手順は、次のとおりです。
Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。
「デシジョン関数」領域で「作成」をクリックします。
「名前」フィールドにデシジョン関数名を入力するか、図6-1に示すようにデフォルト名を使用します。
「デシジョン関数」表で、デシジョン関数のアイコンをダブルクリックします。 たとえば、DecisionFunction_1というデシジョン関数のアイコンをダブルクリックします。図6-2に示すように、「デシジョン関数の編集」ダイアログが表示されます。
「名前」フィールドに名前を入力するか、またはデフォルト値を使用します。
必要に応じて「説明」フィールドに説明を入力します。
「ルール起動制限」フィールドで「無制限」を選択します。 デシジョン関数をデバッグするときに、「ルール起動制限」に「無制限」
以外の値の入力が必要になる場合があります。 詳細は、第6.3.2項「ルール・デバッグ用の「ルール起動制限」オプションに関する必須情報」を参照してください。
適切なデシジョン関数オプションを選択します。
「Webサービスとして起動」: デシジョン関数をWebサービスとして起動するかどうかを選択します。 詳細は、第6.3.4項「「Webサービスとして起動」オプションに関する必須情報」を参照してください。
「ルール・フローの確認」: このオプションを選択すると、ルール・フローをチェックして、適切なタイプのファクトがデシジョン関数に明示的に入力されるか、またはルール・フロー内でルールによりアサートされることを確認できます。 ただし、このオプションを選択しても、常に有用な情報が生成されるとはかぎりません。デシジョン関数を使用するJavaコードでファクトをアサートできる場合がありますが、このコードはデザインタイムに使用できない可能性があります。 この場合、「ルール・フローの確認」を選択しても有用でないことを示す検証警告が生成されることがあります。
「ステートレス」: このオプションは、デシジョン関数がステートレスの場合に選択します。 詳細は、第6.3.5項「デシジョン関数の「ステートレス」オプションに関する必須情報」を参照してください。
「入力」表で、「追加」をクリックして入力を追加します。「入力」表で、入力ごとに適切なオプションを選択します。
「名前」: 入力名を入力して[Enter]を押すか、またはデフォルト名を使用します。
「ファクト・タイプ」: ドロップダウン・リストから適切なファクト・タイプを選択します。
「ツリー」: このオプションを選択しない場合、入力はassert
関数を使用してアサートされます。 このオプションを選択した場合、入力はassertTree
関数を使用してアサートされます。 この場合、入力オブジェクトは、List
または配列型プロパティを使用して1対多関係で他のオブジェクトに接続されるオブジェクト・ツリーのルートであると予期されます。詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。
「リスト」: このオプションを選択しない場合、入力をシングル・オブジェクトにする必要があり、アサーションはそのシングル入力オブジェクトにのみ適用されます。 このオプションを選択する場合、入力をオブジェクトのList
にする必要があり、アサーションは入力のList
(java.util.List
)の各オブジェクトに適用されます。
「出力」表で、「追加」をクリックして出力を追加します。「出力」表で、出力ごとに適切なオプションを選択します。
「名前」: 出力名を入力して[Enter]を押すか、またはデフォルト名を使用します。
「ファクト・タイプ」: ドロップダウン・リストから適切なファクト・タイプを選択します。
「ツリー」: このオプションを選択すると、特定のデザインタイムのデシジョン関数引数チェックを有効にするフラグが設定されます。 出力引数については、このオプションを選択してもランタイム動作に影響しません。 ただし、デザインタイムに複数のデシジョン関数を順番にコールする場合は、1つのデシジョン関数の出力がツリーであることを明示的に指定すると有用です。 これは、シーケンス内の別のデシジョン関数の入力は、入力としてツリーを予期することを意味します。詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。
「リスト」: このオプションを選択しない場合、出力はシングル・オブジェクトです。 このオプションを選択した場合、出力はオブジェクトのグループです。 出力引数の「リスト」オプションの動作の詳細は、第6.3.3項「デシジョン関数の引数に関する必須情報」を参照してください。
「ルールセットおよびデシジョン関数」領域で、シャトルを使用して項目を「使用可能」ボックスから「選択済」ボックスに移動します。
「選択済」ボックスで項目を選択し、必要に応じて「上に移動」または「下に移動」をクリックして、ルールセットおよびデシジョン関数の順序を変更します。
既存のデシジョン関数を編集する手順は、次のとおりです。
Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。
編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
デシジョン関数を追加する場合と同様に、適切なデシジョン関数のフィールドを編集します。
入力の順序を変更する手順は、次のとおりです。
Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。
編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
移動する入力引数を選択します。 「上に移動」または「下に移動」をクリックして、入力引数の順序を変更します。
出力の順序を変更する手順は、次のとおりです。
Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。
編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
移動する出力引数を選択します。 「上に移動」または「下に移動」をクリックして、出力引数の順序を変更します。
Rules Designerでは、デシジョン関数に対する削除操作を元に戻したり再実行できます。 この操作を実行するには、「元に戻す デシジョン関数」アイコンをクリックします。 ただし、デシジョン関数を削除した後に元に戻す操作を実行すると、削除したデシジョン関数は表示されますが、重大なディクショナリの問題が発生したり、ディクショナリが使用できなくなる可能性があります。
Rules Designerでは、デシジョン関数を削除した後に「元に戻す デシジョン関数」アイコンを使用しないでください。
「ルール起動制限」では、実行時に許可されるステップ(ルール起動)の最大数を設定できます。 このオプションを使用して「無制限」以外の値を指定すると、特定のルールの設計問題をデバッグしたり、場合によっては実行時のjava.lang.OutOfMemoryError
エラーを防止できます。 これは、無限に再帰するルール起動をデバッグするときに役立ちます。
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
関数を使用してアサートされます。 また、「ツリー」が選択されている場合、入力オブジェクトは、List
または配列型プロパティを使用して1対多関係で他のオブジェクトに接続されるオブジェクト・ツリーのルートであると予期されます。
「ルールセットおよびデシジョン関数」領域の「選択済」ボックスで指定されたデシジョン関数の選択済ルールセットについて、生成されたRL Language関数には、選択されたルールセットのスタック順序に従って選択済ルールセットを指定したrun()
へのコールが含まれています。
生成されたRL Language関数には、出力パラメータの数に応じて、デシジョン関数の出力用の出力が含まれています。 表6-1に、デシジョン関数の出力オプションを示します。
表6-1 出力数に応じたデシジョン関数の出力オプション
出力パラメータ | 説明 |
---|---|
0 |
戻り値はnullです。 |
1 |
要素が1つのみ戻されます。 |
2以上 |
出力はlistプロパティの値によって異なります。
|
デシジョン関数を編集した後(入力と出力の変更、追加など)、変更内容は新規ビジネス・ルール・アクティビティについてBPELで参照可能になります。ただし、既存のビジネス・ルール・アクティビティでは変更内容を参照できません。詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のビジネス・ルール・サービス・コンポーネントの使用に関する項を参照してください。
デシジョン関数のオプション「Webサービスとして起動」を選択すると、Oracle Business RulesでXMLデータ型の入力と出力を持つRL Language関数が生成されます。 このオプションにより、Webサービスからデシジョン関数を使用できます。
この追加のRL Language関数には、次のシグネチャがあります。
function <name>Service(T1 input1, ... Tn inputN, org.w3.dom.Node outputParentNode)
Tiは、次のように入力iのデシジョン関数の入力の「リスト」オプションの値に応じて拡張されます。
「リスト」オプションが選択されていない場合: org.w3.dom.Element
「リスト」オプションが選択されている場合: java.util.List<org.w3.dom.Element>
入力のElement
引数は、InputFactType
の入力になるようにアンマーシャリングされません。結果的なファクト・タイプは、それぞれElement
にマーシャリングされて戻されます。 これらは、結果を戻さない生成関数OutputFactType
またはList
に渡されます。
マーシャリングされた出力要素がある場合は、関数の最後の引数outputParentNode
として渡される値に子要素として追加されます。このノードは、Element
、Document
またはDocumentFragment
である必要があります。
DecisionFunction
のAPIの詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。
デシジョン関数は、ステートフル操作またはステートレス操作をサポートしています。 「デシジョン関数の編集」ダイアログの「ステートレス」チェックボックスを使用して、これらの2つの操作モードを切り替えることができます。
デフォルトでは、「ステートレス」チェックボックスが選択されており、ステートレス操作を示しています。 ステートレス操作では、実行時に、デシジョン関数の起動が終わるたびにルール・セッションが解放されます。
「ステートレス」の選択を解除すると、基礎となるOracle Business Rulesオブジェクトはビジネス・ルール・サービス・エンジンのメモリーに保管されるため、操作の終了時にルール・セッション・プールに戻されません。 これ以降にデシジョン関数を使用すると、キャッシュされているRuleSessionオブジェクトが再利用され、そのすべての状態情報が前回の起動から取得されます。 したがって、「ステートレス」の選択を解除すると、ルール・セッションは以降のリクエストのために保存され、同じプロセスからの一連のデシジョン関数の起動は常にステートレス起動で終了します。