この章では、デシジョン関数を使用して、Javaアプリケーション、コンポジットまたはBPELプロセスからルールをコールする方法について説明します。
この章の項目は、次のとおりです。
デシジョン関数には次の宣言が含まれています。
入力ファクト
ルールセットおよびネストしたデシジョン関数
出力ファクト
デシジョン関数では、次の操作が実行されます。
Oracle Business Rules Engineの作業メモリーに入力をルール・ファクトとしてアサートします。
現在のデシジョン関数およびネストしたデシジョン関数で構成されたルールセットを順番に実行します。
Oracle Business Rules Engineの作業メモリーから出力ファクトを返します。
デシジョン関数を作成して、JavaアプリケーションやBPELプロセスからOracle Business Rulesを簡単に使用できます。デシジョン関数では、使用するルールを複数のルールセットとして編成し、ルールセットを規定の順序で実行できます。ファクトは最初のルールセットに進み、このルールセットで2番目以降のルールセットに進む追加のファクトをアサートでき、最後にデシジョン関数の出力としてデシジョン関数に戻ります。
デシジョン関数を追加するにはRules Designerを使用します。
デシジョン関数を追加する手順は、次のとおりです。
Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。
「デシジョン関数」領域で、「作成」アイコンをクリックします。
新しいデシジョン関数が作成され、図6-1のように、「デシジョン関数の編集」ダイアログが表示されます。
「名前」フィールドにデシジョン関数名を入力します。
必要に応じて「説明」フィールドに説明を入力します。
「ルール起動制限」フィールドで「無制限」または値を選択します。デシジョン関数をデバッグするときに、ルール起動制限の値の入力が必要になる場合があります。詳細は、第6.3.1項「ルール・デバッグ用の「ルール起動制限」オプションに関する必須情報」を参照してください。
「ルール起動制限がエラー」を選択します。起動制限に到達すると、システムがエラーをスローします。
適切なデシジョン関数オプションを選択します。
「Webサービスとして起動」: デシジョン関数をWebサービスとして起動するかどうかを選択し、Webサービス名を指定します。
ルール・フローの確認: このオプションを選択すると、適切なタイプのファクトがデシジョン関数への明示的な入力になるか、ルール・フローでルールによってアサートされるように、ルール・フローが確認されます。ただし、このオプションを選択しても、常に有益な情報が作成されるわけではなく、デシジョン関数を使用するJavaコードでファクトをアサートできても、設計時にこのコードが使用できない場合もあります。この場合、「ルール・フローの確認」の選択により発生する検証の警告は役に立たない可能性があります。
「ステートレス」: このオプションは、デシジョン関数がステートレスの場合に選択します。詳細は、第6.3.3項「デシジョン関数の「ステートレス」オプションに関する必須情報」を参照してください。
「入力」タブで、「追加」をクリックして入力を追加します。「入力」表で、入力ごとに適切なオプションを選択します。
「名前」 - 入力名を入力して[Enter]を押すか、またはデフォルト名を使用します。
「ファクト・タイプ」 - リストから適切なファクト・タイプを選択します。
「ツリー」 - このオプションを選択しない場合、入力はassert
関数を使用してアサートされます。このオプションを選択した場合、入力はassertTree
関数を使用してアサートされます。この場合、入力オブジェクトは、List
プロパティを使用して1対多関係で他のオブジェクトに接続されるオブジェクト・ツリーのルートであると予期されます。詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。
「リスト」 - このオプションを選択しない場合、入力をシングル・オブジェクトにする必要があり、アサーションはそのシングル入力オブジェクトにのみ適用されます。このオプションを選択する場合、入力をオブジェクトのList
にする必要があり、アサーションは入力のList
(java.util.List
)の各オブジェクトに適用されます。
「説明」 - 入力の説明です。
「出力」タブで、「追加」をクリックして出力を追加します。「出力」表で、出力ごとに適切なオプションを選択します。
「名前」 - 出力名を入力して[Enter]を押すか、またはデフォルト名を使用します。
「ファクト・タイプ」 - リストから適切なファクト・タイプを選択します。
「ツリー」 - このオプションを選択すると、特定のデザインタイムのデシジョン関数引数チェックを有効にするフラグが設定されます。出力引数については、このオプションを選択してもランタイム動作に影響しません。ただし、デザインタイムに複数のデシジョン関数を順番にコールする場合は、1つのデシジョン関数の出力がツリーであることを明示的に指定すると有用です。これは、シーケンス内の別のデシジョン関数の入力は、入力としてツリーを予期することを意味します。詳細は、第4.8項「ツリー・モードのルールの使用」を参照してください。
「リスト」 - このオプションを選択しない場合、出力はシングル・オブジェクトです。このオプションを選択した場合、出力はオブジェクトのグループです。出力引数の「リスト」オプションの動作の詳細は、第6.3.2項「デシジョン関数の引数に関する必須情報」を参照してください。
「説明」 - 出力の説明です。
「初期アクション」タブでは、アサートする前に入力ファクトを変更したり、ルールセット・スタックを変更したり、有効日を設定したり、出力ファクトをアサートしたりするために使用できるアクションを追加できます。これらのアクションは、ルールのかわりに使用したり、ルールを実行するための環境「設定」のために使用できます。
「初期アクション」タブを使用して、1つのデシジョン関数(DF1)で別のデシジョン関数(DF2)をコールする場合を考えてみます。DF1は、Ruleset1をルールセット・スタックに追加するように構成されています。DF2は、Ruleset2を追加するように構成されています。DF1では、初期アクションを実行する前に、Ruleset1をルールセット・スタックに追加します。次に、DF2がコールされると、Ruleset2も追加されます。つまり、ルールの実行が開始されると、ルールセット・スタックによって、両方のルールセットのルールが起動します。Ruleset2を追加する場合(初期アクションでDF2をコールしているため)、DF1の初期アクションを使用して、DF2をコールする前にルールセット・スタックをクリアし、DF2をコールした後でスタックにRuleset1を追加できます。
図6-2に示すように、assert
、call
、modify
の範囲の必要なアクションを、if
、else
、elseif
、while
、for
、if
(advanced)
、while
(advanced)
のような条件アクションにも追加できます。
注意: 「ルールセットおよびデシジョン関数」タブでデシジョン関数DF1にDF2が含まれている場合は、DF2には初期アクションが含まれていない可能性があります。 |
if
(advanced)
およびwhile
(advanced)
条件アクションは、boolean
値のみを受け入れます。アクション条件ごとに異なるテスト・フォーム・タイプを追加できます。
「ルールセットおよびデシジョン関数」領域で、シャトルを使用して項目を「使用可能」ボックスから「選択済」ボックスに移動します。
「選択済」ボックスで項目を選択し、必要に応じて「上に移動」または「下に移動」をクリックして、ルールセットおよびデシジョン関数の順序を変更します。
既存のデシジョン関数を編集する手順は、次のとおりです。
Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。
編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
デシジョン関数を追加する場合と同様に、適切なデシジョン関数のフィールドを編集します。
入力の順序を変更する手順は、次のとおりです。
Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。
編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
移動する入力引数を選択します。「上に移動」または「下に移動」をクリックして、入力引数の順序を変更します。
出力の順序を変更する手順は、次のとおりです。
Rules Designerで、「デシジョン関数」ナビゲーション・タブを選択します。
編集するデシジョン関数を選択して「編集」アイコンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
移動する出力引数を選択します。「上に移動」または「下に移動」をクリックして、出力引数の順序を変更します。
デシジョン関数を編集する手順は、次のとおりです。
「デシジョン関数」タブをクリックします。
図6-3に示すように、デシジョン関数が表示されます。
編集対象のデシジョン関数を選択して、「編集」アイコンをクリックします。
「デシジョン関数の編集」ダイアログが表示されます。
デシジョン関数の新規追加に使用したプロセスを使用して、必要な変更を行います。
「ルール起動制限」では、実行時に許可されるステップ(ルール起動)の最大数を設定できます。このオプションを使用して「無制限」以外の値を指定すると、特定のルールの設計問題をデバッグしたり、場合によっては実行時の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関数はリストを返します。このリストには、デシジョン関数の各出力の要素が順番に含まれています。出力がリストとして宣言された場合、対応する要素はリストになります。しかし、出力がリストとして宣言されていない場合、対応する要素は出力ファクトまたはnull(宣言されたタイプの出力ファクトが存在しない場合)になります。出力がリストとして宣言されていないときに、Oracle Business Rules Engineの作業メモリー内に指定したタイプの出力ファクトが複数見つかった場合は、例外がスローされます。
デシジョン関数を編集した後(入力と出力の変更、追加など)、変更内容は新規ビジネス・ルール・アクティビティについてBPELで参照可能になります。ただし、既存のビジネス・ルール・アクティビティでは変更内容を参照できません。詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle Business Rulesに関する項を参照してください。
デシジョン関数は、ステートフル操作またはステートレス操作をサポートしています。「デシジョン関数の編集」ダイアログの「ステートレス」チェックボックスを使用して、これらの2つの操作モードを切り替えることができます。
デフォルトでは、「ステートレス」チェックボックスが選択されており、ステートレス操作を示しています。ステートレス操作では、実行時に、デシジョン関数の起動が終わるたびにルール・セッションが解放されます。
「ステートレス」の選択を解除すると、基礎となるOracle Business Rulesオブジェクトはビジネス・ルール・サービス・エンジンのメモリーに保管されるため、操作の終了時にルール・セッション・プールに戻されません。これ以降にデシジョン関数を使用すると、キャッシュされているRuleSessionオブジェクトが再利用され、そのすべての状態情報が前回の起動から取得されます。したがって、「ステートレス」の選択を解除すると、ルール・セッションは以降のリクエストのために保存され、同じプロセスからの一連のデシジョン関数の起動は常にステートレス起動で終了します。