ヘッダーをスキップ
Oracle Fusion Middleware Oracle Business Rulesユーザーズ・ガイド
11g リリース1(11.1.1)
B55917-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

7 Rules SDKデシジョン・ポイントAPIの使用

Oracle Business Rules SDK(Rules SDK)を使用すると、Oracle Business Rulesのディクショナリのルールにアクセスしたり、ルールを作成、変更および実行したり、ディクショナリの内容を操作するアプリケーションを記述できます。 この章では、Rules SDKの概要、およびRules SDKデシジョン・ポイントAPIの使用方法について説明します。

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

詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

7.1 Rules SDKとレンタカー・サンプル・アプリケーションの概要

Rules SDKは、次の4つの領域で構成されています。

説明以外の目的でRules SDKのこれらの領域が明示的に区別されることはありません。 たとえば、ルールを編集するには、Rules SDKのストレージ領域を使用して、ディクショナリにもアクセスする必要があります。 Rules SDKがこれらの領域に分割されているのは、個別のRules SDK APIを説明するためではなく、各種の使用モードを説明しやすくするためです。

7.1.1 デシジョン・ポイントAPIの概要

デシジョン・ポイントAPIを使用すると、ルールを簡単に実行できます。 ほとんどのユーザーは、Oracle JDeveloperのRules Designer拡張機能を使用して、データ・モデル要素、ルール、デシジョン表、ルールセットなどのOracle Business Rulesアーチファクトを作成します。 したがって、ほとんどのユーザーは、Rules SDKのエンジン、ストレージまたは編集機能を直接使用する必要はありません。

Rules SDKのデシジョン・ポイント・パッケージを使用するには、次の3つの重要なクラスを理解する必要があります。

  • DecisionPoint: ファクトリの設計パターンに従ってDecisionPointInstanceのインスタンスを作成するヘルパー・クラスです。 ほとんどのアプリケーションには、すべてのアプリケーション・スレッドで共有されるDecisionPointオブジェクトが1つ必要です。 コール元はDecisionPointgetInstance()メソッドを使用して、定義済デシジョン・ポイントのコールに使用できるDecisionPointInstanceのインスタンスを取得します。

  • DecisionPointBuilder: ビルダーの設計パターンに従ってデシジョン・ポイントを作成します。

  • DecisionPointInstance: ユーザーはこのクラスのinvoke()をコールしてファクトをアサートし、デシジョン関数を実行します。

DecisionPointクラスでは、流れるようなインタフェース・モデルがサポートされているため、メソッドを連鎖させることができます。 詳細は、次を参照してください。

http://www.martinfowler.com/bliki/FluentInterface.html

デシジョン・ポイントは、次のようなルール実行のいくつかの側面を管理します。

  • oracle.rules.rl.RuleSessionオブジェクトの使用

  • ディクショナリ更新時のディクショナリのリロード

Javaアプリケーションのデシジョン・ポイントを作成するために必要なものは次のとおりです。

  • MDSリポジトリからロードするディクショナリまたは事前ロード済のoracle.rules.sdk2.dictionary.RuleDictionaryインスタンスの名前。

  • 指定したディクショナリに格納されているデシジョン関数の名前。

7.1.2 レンタカー・サンプル・アプリケーションの入手方法

この章では、Rules SDKとデシジョン・ポイントAPIの使用方法を示すレンタカー・アプリケーションについて説明します。 このサンプル・アプリケーションは、CarRentalApplication.zipというZIPファイルで入手できます。 このZIPファイルには、完全なJDeveloperアプリケーションとプロジェクトが含まれています。

Oracle Business Rules固有のサンプルのソースコードを、次のWebサイトからオンラインで入手できます。

http://www.oracle.com/technology/sample_code/products/rules

SOAのサンプルは、次のWebサイトから入手できます。

http://www.oracle.com/technology/sample_code/products/soa

サンプルを使用するには、CarRentalApplication.zipを適切なディレクトリに解凍します。 レンタカー・アプリケーションのプロジェクトには、ルール・ディクショナリおよびRules SDKを使用したいくつかのJavaサンプルが含まれています。

7.1.3 レンタカー・サンプル・アプリケーションとプロジェクトを開く方法

レンタカー・サンプル・アプリケーションにより、Rules SDKデシジョン・ポイントAPIの使用方法がわかります。

レンタカー・サンプル・アプリケーションを開く手順は、次のとおりです。

  1. Oracle JDeveloperを起動します。

  2. サンプルを解凍したディレクトリにあるレンタカー・アプリケーションを開きます。 たとえば、「ファイル」メニューから「開く」を選択し、「開く」ダイアログでCarRentalApplicationフォルダにナビゲートします。

  3. 「開く」ダイアログで「CarRentalApplication.jws」を選択し、「開く」をクリックします。

  4. 「アプリケーション・ナビゲータ」で「CarRentalApplication」を開き、「アプリケーション・ソース」「リソース」を開きます。 CarRental.rulesという名前のOracle Business RulesディクショナリといくつかのJavaソース・ファイルが表示されます。

7.2 デシジョン・ポイントで使用するディクショナリの作成

レンタカー・サンプルでは、事前ロード済のOracle Business RulesディクショナリまたはMDSに格納されているリポジトリでRules SDKデシジョン・ポイントAPIを使用します。 開発環境で作業する場合は、事前ロード済のディクショナリ・シグネチャでデシジョン・ポイントAPIを使用できます。 本番環境では、一般にMDSリポジトリ・シグネチャでデシジョン・ポイントを使用します。

CarRentalディクショナリが事前に定義されており、レンタカー・サンプル・アプリケーションで使用できます。

デシジョン・ポイントAPIを使用するには、デシジョン関数を含むディクショナリを作成する必要があります(レンタカー・サンプル・アプリケーションには、事前定義済のディクショナリとデシジョン関数が用意されています)。

ディクショナリとデシジョン関数を作成するには、次の手順を実行します。

7.2.1 デシジョン・ポイントで使用するデータ・モデル要素の作成方法

デシジョン・ポイントを使用してアプリケーションを作成する場合、デシジョン関数に追加する次のディクショナリが必要になります。

用意されているレンタカー・サンプル・アプリケーションのデータ・モデルを表示する手順は、次のとおりです。

  1. Rules Designerで、「ファクト」ナビゲーション・タブをクリックします。

  2. 図7-1に示すように、「Javaファクト」タブを選択します。

    「Javaファクト」タブに、ディクショナリに組み込まれているファクト・タイプに加えて、インポートされた次の4つのファクト・タイプが表示されます。

    Driver Javaファクトは、プロジェクト内のDriver Javaクラスからインポートされています。

    Denial Javaファクトは、プロジェクト内のDenial Javaクラスからインポートされています。

    LicenseTypeファクトとVehicleTypeファクトは、Driverクラスで定義されている、ネストした列挙クラスからインポートされています。

    図7-1 レンタカー・サンプル・アプリケーション用に定義されているJavaファクト

    図7-1の説明が続きます
    「図7-1 レンタカー・サンプル・アプリケーション用に定義されているJavaファクト」の説明

Rules SDKのデシジョン・ポイントを使用する場合は、指定したディクショナリ内のデシジョン関数をコールします。 コールするデシジョン関数には、デシジョン・ポイントの一部として実行される1つ以上のルールセットを含めることができます。

用意されているレンタカー・サンプル・アプリケーションのルールセットを表示する手順は、次のとおりです。

  1. Rules Designerで「CarRentalApplication」を開きます。

  2. 「CarRentalApplication」で「リソース」を開きます。

  3. 「CarRental.rules」をダブルクリックします。

7.2.2 デシジョン・ポイントからコールするデシジョン関数の表示方法

デシジョン・ポイントAPIを使用する場合は、デシジョン関数を使用してOracle Business Rulesディクショナリを公開します。デシジョン関数の詳細は、第6章「デシジョン関数の使用」を参照してください。

レンタカー・サンプル・アプリケーションのデシジョン関数を表示する手順は、次のとおりです。

  1. Rules Designerで、「デシジョン関数」ナビゲーション・タブをクリックします。 図7-2に示すように、CarRentalディクショナリ内の使用可能なデシジョン関数が表示されます。

    図7-2 レンタカー・サンプルのデシジョン関数

    図7-2の説明が続きます
    「図7-2 レンタカー・サンプルのデシジョン関数」の説明

  2. CarRentalDecisionFunctionの行を選択し、デシジョン関数のアイコンをダブルクリックします。 図7-3に示すように、「デシジョン関数の編集」ダイアログが開きます。

    デシジョン関数の「入力」表には、Driverファクト・タイプの単一の引数が表示されます。

    デシジョン関数の「出力」表には、Denialファクト・タイプの単一の引数が表示されます。

    デシジョン関数の「ルールセットおよびデシジョン関数」領域の「選択済」ボックスには、「Denial Rules:if-then」が表示されます。

    図7-3 レンタカー・サンプル・アプリケーションのレンタカー・デシジョン関数

    図7-3の説明が続きます
    「図7-3 レンタカー・サンプル・アプリケーションのレンタカー・デシジョン関数」の説明

7.2.3 デシジョン関数のルールまたはデシジョン表の作成方法

レンタカー・サンプルには、2つのルールセットが含まれています。一方にはIF/THENルールが含まれ、もう一方にはデシジョン表が含まれています。 デシジョン・ポイントを使用する場合は、IF/THENルールまたはデシジョン表、あるいはその両方をアプリケーションで使用できます。

レンタカー・サンプル・アプリケーションのルールを表示する手順は、次のとおりです。

  1. 図7-4に示すように、Rules Designerで「Denial Rules:if-then」ルールセットをクリックします。

    図7-4 レンタカー・サンプル・アプリケーションのIF/THENルールを含むルールセット

    図7-4の説明が続きます
    「図7-4 レンタカー・サンプル・アプリケーションのIF/THENルールを含むルールセット」の説明

「Denial Rules:if-then」ルールセットには、次の2つのルールが含まれています。

  • under age: このルールは、運転者の最低年齢を定義します。 DriverインスタンスのageプロパティをグローバルのMinimum driver ageと比較します。 運転者がこの年齢未満の場合、新しいDenialファクトがアサートされます。 デシジョン関数へのコールにより、このDenialファクトが出力の定義に従って収集されます。また、このルールは、Denialが作成された理由を示す監査出力を提供するために、ユーザー定義関数auditもコールします。

  • too many accidents: このルールは、事故件数の上限しきい値を定義します。事故件数がこの値を超える運転者に対するレンタルは拒否されます。また、このルールは、Denialが作成された理由を示す監査出力を提供するために、ユーザー定義関数auditもコールします。

レンタカー・アプリケーションのデシジョン表を表示する手順は、次のとおりです。

  1. 図7-5に示すように、Rules Designerで「Denial Rules:decision table」ルールセットをクリックします。

図7-5 レンタカー・サンプル・アプリケーションのデシジョン表を含むルールセット

図7-5の説明が続きます
「図7-5 レンタカー・サンプル・アプリケーションのデシジョン表を含むルールセット」の説明

7.2.4 デシジョン表を使用したレンタカー・サンプルの使用に関する必須情報

レンタカー・サンプル・アプリケーションには、「Denial Rules: decision table」ルールセットが含まれています。 用意されているデシジョン関数サンプルでデシジョン表を使用するように切り替えるには、図7-6に示すように、デシジョン関数の「選択済」領域から「Denial Rules:if-then」を移動し、デシジョンテーブルを使用して同様のルールを定義する「Denial Rules: decision table」ルールセットをこの領域に追加します。

図7-6 デシジョン表ルールセットを使用したレンタカー・サンプルのデシジョン関数

図7-6の説明が続きます
「図7-6 デシジョン表ルールセットを使用したレンタカー・サンプルのデシジョン関数」の説明

7.3 Rules SDKデシジョン・ポイントを使用したJavaアプリケーションの作成

開発環境でRules SDKを使用する場合は、デシジョン・ポイントAPIを事前ロード済のディクショナリで使用できます。 本番環境では、一般にMDSリポジトリ・シグネチャでデシジョン・ポイントAPIを使用し、ディクショナリはMDSに格納されます。 デシジョン・ポイントの使用方法の詳細は、第7.5項「本番環境でのデシジョン・ポイントの使用に関する必須情報」を参照してください。

Oracle Business Rules固有のサンプルのソースコードを、次のWebサイトからオンラインで入手できます。

http://www.oracle.com/technology/sample_code/products/rules

SOAのサンプルは、次のWebサイトから入手できます。

http://www.oracle.com/technology/sample_code/products/soa

CarRentalProjectプロジェクトには、レンタカー・サンプル・ファイルのCarRentalWithDecisionPointUsingPreloadedDictionary.javaを含むcom.example.rules.demoパッケージが含まれています。 また、デシジョン・ポイントの様々な使用方法をサポートするいくつかの.javaソース・ファイルも含まれています。 表7-1に、レンタカー・サンプルの様々なバージョンの要約を示します。

Rules SDKデシジョン・ポイントAPIの使用方法の詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Business Rules』を参照してください。

表7-1 デシジョン・ポイント・サンプルCarRentalProject内のJavaファイル

ベースJavaファイル名 説明

CarRental

これはすべてのサンプルのベース・クラスです。 CarRentalディクショナリおよびDriverクラスのインスタンスを作成するcreateDriversメソッドを使用するための定数値が含まれています。

CarRentalWithDecisionPoint

DecisionPointタイプの静的属性およびDriverクラスの指定したインスタンスでデシジョン・ポイントを起動するcheckDriver()メソッドが含まれています。 これらのメソッドはサンプル・アプリケーション用に含まれているため、MDSリポジトリと事前ロード済ディクショナリの両方のサンプルで同じcheckDriver()の実装を共有できます。

CarRentalWithDecisionPointUsingMdsRepository

MDSを使用してルール・ディクショナリのアクセスとロードを行うデシジョン・ポイントの作成サンプルが含まれています。 本番環境では、ほとんどのアプリケーションはデシジョン・ポイントAPIをMDSで使用します。

CarRentalWithDecisionPointUsingPreloadedDictionary

RuleDictionaryクラスのインスタンスからデシジョン・ポイントを作成するサンプルが含まれています。 このサンプルには、ディクショナリを手動でロードしてRuleDictionaryインスタンスを作成するためのコードも含まれています。

CarRentalWithRuleSession

エンジンAPIの高度な使用サンプルが含まれています。詳細はコメントに記述されています。

CarRentalWithRuleSessionPool

エンジンAPIの高度な使用サンプルが含まれています。詳細はコメントに記述されています。

Denial

ルールとデシジョン表の作成に使用されるDenialファクト・タイプを定義するクラスが含まれています。

Driver

ルールとデシジョン表の作成に使用されるDriverファクト・タイプを定義するクラスが含まれています。

DriverCheckerRunnable

同時ユーザーによるデシジョン・ポイントの起動をシミュレートするスレッドとして使用できるクラスが含まれています。


7.3.1 デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法

デシジョン・ポイントを使用するには、例7-1に示すように、DecisionPointBuilderを使用してDecisionPointインスタンスを作成します。

例7-1 デシジョン・ポイント・ビルダーの使用

    static {
        try {
            // specifying the Decision Function and a pre-loaded
            // RuleDictionary instance
            m_decisionPoint =  new DecisionPointBuilder()
                                .with(DF_NAME)
                                .with(loadRuleDictionary())
                                .build();
        } catch (SDKException e) {
            System.err.println("Failed to build Decision Point: " + e.getMessage());
            e.printStackTrace();
        }
    }

例7-1は、DecisionPointBuilderが流れるようなインタフェース・パターンをサポートしているため、デシジョン・ポイントの作成時にすべてのメソッドを容易に連鎖させることができることを示しています。 DecisionPointBuilderでデシジョン・ポイントを構成するための最も一般的な3つのメソッドは、with()という名前を持つようにオーバーロードされます。 各with()メソッドは、RuleDictionary型、DictionaryFQN型またはString型の単一の引数を使用します。 DecisionPointBuilderは、類似のsetメソッドとgetメソッド(getDecisionFunction()setDecisionFunction()getDictionary()setDictionary()getDictionaryFQN()setDictionaryFQN())もサポートしています。

例7-1に示すこの連鎖には、次のステップが含まれています。

  1. 最初のステップでは、次のようなコードでDecisionPointBuilderインスタンスを作成します。

    new DecisionPointBuilder()
    
  2. String引数を使用するwith()メソッドで、デシジョン・ポイントによって実行されるデシジョン関数の名前を定義します。このメソッドのコールは必須です。

    .with(DF_NAME)
    

    DF_NAMEには、アプリケーションで定義したデシジョン関数の名前を指定します。 たとえば、レンタカー・サンプル・アプリケーションでは、DF_NAMECarRental.javaCarRentalDecisionFunctionと定義されています。

  3. これ以外の2つのwith()メソッドのうち、いずれか1つのみをコールします。 このサンプル・コードでは、指定したデシジョン関数を含む事前ロード済のルール・ディクショナリ・インスタンスを使用しています。 loadDictionary()メソッドは、ファイルからRuleDictionaryのインスタンスをロードします。 例7-2に、loadDictionary()メソッドを示します。 詳細は、第7.3.2項「事前ロード済のディクショナリでデシジョン・ポイントを使用する方法」を参照してください。

    .with(loadRuleDictionary())
    
  4. DecisionPointインスタンスを作成して戻すために、build()メソッドをコールします。

DecisionPointインスタンスはアプリケーションのすべてのインスタンスで共有されます。このため、静的属性であり、静的ブロックに作成されます。 DecisionPointを初期化する別の方法として、DecisionPointインスタンスを作成して戻した静的メソッドでm_decisionPoint属性を初期化する方法があります。

7.3.2 事前ロード済のディクショナリでデシジョン・ポイントを使用する方法

例7-2に、ファイルからRuleDictionaryのインスタンスをロードするloadRuleDictionary()メソッドを示します。

例7-2 ルール・ディクショナリのロード・メソッド

    private static RuleDictionary loadRuleDictionary(){
        RuleDictionary dict = null;
        Reader reader = null;
        Writer writer = null;
        try {
            reader = new FileReader(new File(DICT_LOCATION));
            dict = RuleDictionary.readDictionary(reader, new DecisionPointDictionaryFinder(null));
            List<SDKWarning> warnings = new ArrayList<SDKWarning>();

            dict.update(warnings);
            if (warnings.size() > 0 ) {
                System.err.println("Validation warnings: " + warnings);
            }
        } catch (SDKException e){
            System.err.println(e);
        } catch (FileNotFoundException e){
            System.err.println(e);
        } catch (IOException e){
            System.err.println(e);
        } finally {
            if (reader != null) { try { reader.close(); } catch (IOException ioe) {ioe.printStackTrace();}}
            if (writer != null) { try { writer.close(); } catch (IOException ioe) {ioe.printStackTrace();}}
        }

        return dict;
    }

7.3.3 エグゼキュータ・サービスを使用してデシジョン・ポイントでスレッドを実行する方法

レンタカー・サンプルでは、Oracle Business Rulesを使用して複数の同時ユーザーをシミュレートできます。 例7-3に、JavaのExecutorServiceインタフェースを使用して、デシジョン・ポイントを起動する複数のスレッドを実行する方法を示します。 ExecutorServiceは、Rules SDKデシジョン・ポイントAPIに含まれていません。

例7-3 デシジョン・ポイントを起動するスレッドによる運転者の確認

        ExecutorService exec = Executors.newCachedThreadPool();
        List<Driver> drivers = createDrivers();

        for (int i = 0; i < NUM_CONCURRENT; i++) {
            Driver driver = drivers.get(i % drivers.size());
            exec.execute(new DriverCheckerRunnable(driver));
        }

例7-3には、サンプル・アプリケーションの次のコードが含まれています。

  • エグゼキュータ・サービスを作成します。

    ExecutorService exec = Executors.newCachedThreadPool();
    
  • CarRental.javaに定義されているcreateDrivers()メソッドをコールして、Driverインスタンスのリストを作成します。

    List<Driver> drivers = createDrivers();
    
  • Driverインスタンスのリストをループしてdriverリストに運転者を格納します。

  • ループでDriverCheckerRunnableインスタンスから複数のスレッドを開始します。 これらのインスタンスはデシジョン・ポイントを開き、各運転者に対してルールを実行します。 このコードの詳細は、第7.3.4項「デシジョン・ポイント・インスタンスの作成および使用方法」を参照してください。

例7-4に、スレッドの完了を待機するコードを示します。

例7-4 スレッドの完了を待機するコード

        try {
            exec.awaitTermination(5, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        exec.shutdown();
    }

7.3.4 デシジョン・ポイント・インスタンスの作成および使用方法

DriverCheckerRunnableインスタンスはcheckDriver()メソッドをコールします。 例7-5に、CarRentalWithDecisionPointで定義されているcheckDriver()メソッドを示します。 checkDriver()メソッドは、Driverインスタンスによるデシジョン・ポイントの起動を処理します。

例7-5 getInstance()でデシジョン・ポイント・インスタンスを作成するコード

public class CarRentalWithDecisionPoint extends CarRental {

    protected static DecisionPoint m_decisionPoint;

    public static void checkDriver(final Driver driver) {
        try {
            DecisionPointInstance instance = m_decisionPoint.getInstance();
            instance.setInputs(new ArrayList<Object>() {
                    {
                        add(driver);
                    }
                });
            List<Object> outputs = instance.invoke();

            if (outputs.isEmpty())
                System.err.println("Oops, no results");

            java.util.List<Denial> denials =
                (java.util.List<Denial>)outputs.get(0);
            if (denials.isEmpty()) {
                System.out.println("Rental is allowed for " +
                                   driver.getName());
            } else {
                for (Denial denial : denials) {
                    System.out.println("Rental is denied for " +
                                       denial.getDriver().getName() +
                                       " because " + denial.getReason());
                }
            }
        } catch (RLException e) {
            e.printStackTrace();
        } catch (SDKException e) {
            e.printStackTrace();
        }
    }

}

例7-5は、次のことを示しています。

  • 次のコードにより、DecisionPointBuilderで定義された静的なDecisionPointからDecisionPointInstanceを取得します。

     DecisionPointInstance instance = m_decisionPoint.getInstance();
    
  • デシジョン・ポイントに関連付けられているデシジョン関数のシグネチャに従って入力を追加します。 ここでは入力としてList型の引数を1つ定義しています。 このListには、Driverインスタンスが格納されます。

                instance.setInputs(new ArrayList<Object>() {
                        {
                            add(driver);
                        }
                    });
    
  • デシジョン・ポイントを起動し、戻り値を格納します。 戻り型は、デシジョン・ポイントでコールされるデシジョン関数と同じパターンに従います。

     List<Object> outputs = instance.invoke();
    

    この例では、invoke()は、DenialインスタンスのListが格納された長さ1のListを戻します。

  • 1以外のサイズのListが戻された場合は、エラーが生成されます。

    if (outputs.isEmpty())
      System.err.println("Oops, no results");
    
  • デシジョン・ポイントから戻される最初のエントリは、List<Denial>型のリストにキャストされます。

                java.util.List<Denial> denials =
                    (java.util.List<Denial>)outputs.get(0);
    
  • denialsリストが空の場合、Denialインスタンスはルールによってアサートされませんでした。 これは、車を運転者に貸してもよいことを意味しています。 それ以外の場合は、運転者がレンタルを拒否された理由を出力します。

                if (denials.isEmpty()) {
                    System.out.println("Rental is allowed for " +
                                       driver.getName());
                } else {
                    for (Denial denial : denials) {
                        System.out.println("Rental is denied for " +
                                           denial.getDriver().getName() +
                                           " because " + denial.getReason());
                    }
                }
    

7.4 レンタカー・サンプルの実行

システムにインストールされているレンタカー・サンプルで、例7-2に示すコードのDICT_LOCATIONの値をシステムのディクショナリの場所にあわせて変更します。

システムでレンタカー・サンプルを実行する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で、「編集」メニューから「パスのコピー」を選択します。

  2. CarRentalWithDecisionPointUsingPreloadedDictionary.javaファイルで、パスの値をDICT_LOCATIONの値に貼り付けます。

  3. CarRentalProjectで、CarRentalWithDecisionPointUsingPreloadedDictionary.javaファイルを選択します。

  4. 右クリックしてドロップダウン・リストから「実行」を選択します。

例7-6にサンプル出力を示します。

例7-6 レンタカー・サンプルの出力

Rental is allowed for Carol
Rental is allowed for Alice
Rental is allowed for Alice
Rental is allowed for Carol
Rental is denied for Bob because under age, age was 15, minimum age is 21
Mar 13, 2009 11:18:00 AM oracle.rules.rl.exceptions.LogWriter flush
INFO: Fired: under age because driver age less than minimum threshold for license number d222
Mar 13, 2009 11:18:00 AM oracle.rules.rl.exceptions.LogWriter flush
INFO: Fired: under age because driver age less than minimum threshold for license number d222
Rental is denied for Bob because under age, age was 15, minimum age is 21
Rental is allowed for Alice
Rental is allowed for Eve

7.5 本番環境でのデシジョン・ポイントの使用に関する必須情報

本番環境では、MDSリポジトリを使用してOracle Business Rulesのディクショナリを格納できます。 MDSリポジトリを使用してディクショナリを格納する場合は、第7.3.1項「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」第7.3.2項「事前ロード済のディクショナリでデシジョン・ポイントを使用する方法」で示したステップが、ディクショナリにアクセスするように変わります。 CarRentalWithDecisionPointUsingMdsRepositoryに、MDSでデシジョン・ポイントを使用するためのサンプル・コードを示します。

デシジョン・ポイントを使用してMDSのディクショナリにアクセスする方法を示すデプロイメント・ステップの完全なサンプルは、第9.4項「Rules SDKコールを含む等級アプリケーションのサーブレットの追加」を参照してください。

例7-7に、DecisionPointBuilderDictionaryFQNを使用してMDSリポジトリのディクショナリにアクセスする方法を示します。 完全なサンプルは、CarRentalWithDecisionPointUsingMdsRepositoryのサンプル・コードにあります。

例7-7 MDSリポジトリでのデシジョン・ポイント・ビルダーの使用

    static {
        try {
            // specifying the Decision Function and Dictionary FQN
            // loads the rules from the MDS repository.
            m_decisionPoint = new DecisionPointBuilder()
                                .with(DF_NAME)
                                .with(DICT_FQN)
                                .build();
        } catch (SDKException e) {
            System.err.println("Failed to build Decision Point: " +
                               e.getMessage());

例7-1のステップと同様に、例7-7は次のことを示しています。

  1. 最初のステップで、次のコードによりDecisionPointBuilderインスタンスを作成します。

    new DecisionPointBuilder()
    
  2. String引数を使用するwith()メソッドで、デシジョン・ポイントによって実行されるデシジョン関数の名前を定義します。このメソッドのコールは必須です。

    .with(DF_NAME)
    

    DF_NAMEには、アプリケーションで定義したデシジョン関数の名前を指定します。 たとえば、レンタカー・サンプル・アプリケーションでは、これはCarRental.javaCarRentalDecisionFunctionと定義されています。

  3. これ以外の2つのwith()メソッドのうち、いずれか1つのみをコールします。 このサンプル・コードでは、DictionaryFQNをコールしてMDSリポジトリにアクセスします。 例7-8に、ディクショナリ・パッケージとディクショナリ名を使用してDictionaryFQNを作成するルーチンを示します。

    .with(DICT_FQN)
    
  4. DecisionPointインスタンスを作成して戻すために、build()メソッドをコールします。

例7-8 MDSリポジトリでのDictionaryFQNメソッドの使用

    protected static final String DICT_PKG = "com.example.rules.demo";
    protected static final String DICT_NAME = "CarRental";

    protected static final DictionaryFQN DICT_FQN =
        new DictionaryFQN(DICT_PKG, DICT_NAME);
    protected static final String DF_NAME = "CarRentalDecisionFunction";