プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Business Process Managementによるビジネス・ルールの設計
12c (12.2.1.2.0)
E82791-01
目次へ移動
目次

前
次

6 デシジョン関数の使用

この章では、デシジョン関数を使用して、Javaアプリケーション、コンポジットまたはBPELプロセスからルールをコールする方法について説明します。

この章の内容は以下のとおりです。

6.1 デシジョン関数の概要

デシジョン関数は、呼び出すと、指定されたルールセットまたは他のデシジョン関数を適用することで、入力に基づいて出力に到達できる実行のモジュールです。

デシジョン関数には次の宣言が含まれています。

  • 入力ファクト。

  • ルールセットおよびネストしたデシジョン関数。

  • 出力ファクト。

デシジョン関数では、次の操作が実行されます。

  • Oracle Business Rules Engineの作業メモリーに入力をルール・ファクトとしてアサートします。

  • 現在のデシジョン関数およびネストしたデシジョン関数で構成されたルールセットを順番に実行します。

  • Oracle Business Rules Engineの作業メモリーから出力ファクトを返します。

デシジョン関数を作成して、JavaアプリケーションやBPELプロセスからOracle Business Rulesを簡単に使用できます。デシジョン関数では、使用するルールを複数のルールセットとして編成し、ルールセットを規定の順序で実行できます。ファクトは最初のルールセットに進み、このルールセットで2番目以降のルールセットに進む追加のファクトをアサートでき、最後にデシジョン関数の出力としてデシジョン関数に戻ります。

6.2 デシジョン関数の使用

デシジョン関数を追加するにはルール・デザイナを使用します。

デシジョン関数を追加する手順は、次のとおりです。

  1. ルール・デザイナで、「デシジョン関数」タブをクリックします。
  2. 「デシジョン関数」領域で、「作成」ボタンをクリックします。

    新しいデシジョン関数が作成され、図6-1のように、「デシジョン関数の編集」ダイアログが表示されます。

    図6-1 「デシジョン関数の編集」ダイアログ

    図6-1の説明が続きます
    「図6-1 「デシジョン関数の編集」ダイアログ」の説明
  3. デシジョン関数の名前を「名前」フィールド、説明を「説明」フィールドに入力します。
  4. 「ルール起動制限」フィールドで「無制限」または整数値を選択します。デシジョン関数をデバッグするときに、ルール起動制限の値の入力が必要になる場合があります。「ルール起動制限」は、指定数のルールを起動した後に実行を停止する場合にプライマリ・ルール処理でも使用できます。
  5. 適切なデシジョン関数オプションを選択します。
    • ルール起動制限がエラー: ルール起動制限がエラー条件であるかどうかを示すために使用されます。n個のルールが起動された後にルールの処理を停止するシナリオである場合は、このチェック・ボックスの選択を解除します。選択を解除すると、ルール起動制限が適用されますが、エラーとして報告されることはありません。

      ルール起動制限を(たとえば、無限ループを防止する方法などとして)使用するシナリオである場合、このチェック・ボックスを選択します。起動制限に到達すると、システムがエラーをスローします。

    • Webサービスとして起動: デシジョン関数をWebサービスとして起動するかどうかを選択し、Webサービス名を指定します。

    • ルール・フローの確認: ルール・フローの確認により、次のものが検証され、検証警告が生成されます。

      • デシジョン関数によって実行されるルールで必要とされるタイプは、デシジョン関数に対する入力であるか、他のルールによってアサートされます。

      • デシジョン関数によって実行されるルールで生成されるタイプは、他のルールに対する入力であるか、デシジョン関数に対する出力です。

        ルール・フローの確認では、ルールで使用されるJavaコードに広がるルール・フローの問題を特定できない場合があります。このような場合は、フロー・チェックをオフにすることで警告を無視できます。

    • ステートレス: 選択した場合、このオプションは、デシジョン関数がステートレスであることを指定します。詳細は、「デシジョン関数の「ステートレス」オプションに関する必須情報」を参照してください。

  6. 「入力」タブで、「追加」をクリックして入力を追加します。「入力」表で、入力ごとに適切なオプションを選択します。
    • 「名前」 - 入力名を入力して[Enter]を押すか、またはデフォルト名を使用します。

    • 「ファクト・タイプ」 - リストから適切なファクト・タイプを選択します。

    • 「ツリー」 - 選択しない場合、入力はassert関数を使用してアサートされます。このオプションを選択した場合、入力はassertTree関数を使用してアサートされます。選択すると、ルート・オブジェクトが参照するすべてのオブジェクトがアサートされます。詳細は、「ツリー・モードのルールの使用」を参照してください。

    • 「リスト」 - このオプションを選択しない場合、入力をシングル・オブジェクトにする必要があり、アサーションはそのシングル入力オブジェクトにのみ適用されます。このオプションを選択する場合、入力をオブジェクトのListにする必要があり、アサーションは入力のList (java.util.List)の各オブジェクトに適用されます。

    • 「説明」 - 入力の説明です。

  7. 「出力」タブで、「追加」をクリックして出力を追加します。「出力」表で、出力ごとに適切なオプションを選択します。
    • 「名前」 - 出力名を入力して[Enter]を押すか、またはデフォルト名を使用します。

    • 「ファクト・タイプ」 - リストから適切なファクト・タイプを選択します。

    • 「ツリー」 - このオプションを選択すると、特定のデザインタイムのデシジョン関数引数チェックを有効にするフラグが設定されます。出力引数については、このオプションを選択してもランタイム動作に影響しません。ただし、デザインタイムに複数のデシジョン関数を順番にコールする場合は、1つのデシジョン関数の出力がツリーであることを明示的に指定すると有用です。これは、シーケンス内の別のデシジョン関数の入力は、入力としてツリーを予期することを意味します。詳細は、「ツリー・モードのルールの使用」を参照してください。

    • 「リスト」 - このオプションを選択しない場合、出力はシングル・オブジェクトです。このオプションを選択した場合、出力はオブジェクトのグループです。出力引数の「リスト」オプションの動作の詳細は、「デシジョン関数の引数に関する必須情報」を参照してください。

    • 「説明」 - 出力の説明です。

    注意:

    ファクト・タイプの参照可能な属性は、ファクトがルールによって照合できるかまたはアサートできるかを制御します。参照不可のファクト・タイプは、参照可能のファクト・タイプまたは変数の一部であるときは参照可能です。

    デシジョン関数の入力または出力が参照不可のファクト・タイプの場合、参照可能なラッパー・ファクト・タイプが、DF.inという名前の参照不可の入力に対し、およびDF.outという名前の参照不可の出力に対して生成されます。

    たとえば、iがタイプintの入力で、oがタイプintの出力の場合、次のルールにより入力を出力にコピーします。
     IF 
     	DF.in != null 
     THEN 
     	assert new DF.out(o: DF.in.i)
    DF.inを参照しない、またはDF.outをアサートしない場合、ルール・フローの警告が発生します。
  8. 「初期アクション」タブでは、アサートする前に入力ファクトを変更したり、ルールセット・スタックを変更したり、有効日を設定したり、出力ファクトをアサートしたりするために使用できるアクションを追加できます。これらのアクションは、ルールのかわりに使用したり、ルールを実行するための環境「設定」のために使用できます。

    「初期アクション」タブを使用して、1つのデシジョン関数(DF1)で別のデシジョン関数(DF2)をコールする場合を考えてみます。DF1は、Ruleset1をルールセット・スタックに追加するように構成されています。DF2は、Ruleset2を追加するように構成されています。DF1では、初期アクションを実行する前に、Ruleset1をルールセット・スタックに追加します。次に、DF2がコールされると、Ruleset2も追加されます。つまり、ルールの実行が開始されると、ルールセット・スタックによって、両方のルールセットのルールが起動します。Ruleset2を追加する場合(初期アクションでDF2をコールしているため)、DF1の初期アクションを使用して、DF2をコールする前にルールセット・スタックをクリアし、DF2をコールした後でスタックにRuleset1を追加できます。

    図6-2に示すように、assertcallmodifyの範囲の必要なアクションを、ifelseelseifwhileforif (advanced)while (advanced)のような条件アクションにも追加できます。

    図6-2 初期アクションの追加

    図6-2の説明が続きます
    「図6-2 初期アクションの追加」の説明

    注意:

    「ルールセットおよびデシジョン関数」タブでデシジョン関数DF1にDF2が含まれている場合は、DF2には初期アクションが含まれていない可能性があります。

    if (advanced)およびwhile (advanced)条件アクションは、boolean値のみを受け入れます。アクション条件ごとに異なるテスト・フォーム・タイプを追加できます。

  9. 「ルールセットおよびデシジョン関数」領域で、シャトルを使用して項目を「使用可能」ボックスから「選択済」ボックスに移動します。
  10. 「選択済」ボックスで項目を選択し、必要に応じて「上に移動」または「下に移動」をクリックして、ルールセットおよびデシジョン関数の順序を変更します。

6.2.1 既存のデシジョン関数を編集する方法

既存のデシジョン関数を編集する手順は、次のとおりです。

  1. ルール・デザイナで、「デシジョン関数」タブをクリックします。
  2. 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
  3. デシジョン関数を追加する場合と同様に、適切なデシジョン関数のフィールドを編集します。

6.2.2 入力の順序を変更する方法

入力の順序を変更する手順は、次のとおりです。

  1. ルール・デザイナで、「デシジョン関数」タブをクリックします。
  2. 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
  3. 移動する入力引数を選択します。「上に移動」または「下に移動」をクリックして、入力引数の順序を変更します。

6.2.3 出力の順序を変更する方法

出力の順序を変更する手順は、次のとおりです。

  1. ルール・デザイナで、「デシジョン関数」タブをクリックします。
  2. 編集するデシジョン関数を選択して「編集」ボタンをクリックするか、またはデシジョン関数のアイコンをダブルクリックします。
  3. 移動する出力引数を選択します。「上に移動」または「下に移動」をクリックして、出力引数の順序を変更します。

6.2.4 デシジョン関数を編集する方法

デシジョン関数を編集する手順は、次のとおりです。

  1. ルール・デザイナで、「デシジョン関数」タブをクリックします。
  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オブジェクトが再利用され、そのすべての状態情報が前回の起動から取得されます。したがって、「ステートレス」の選択を解除すると、ルール・セッションは以降のリクエストのために保存され、同じプロセスからの一連のデシジョン関数の起動は常にステートレス起動で終了します。