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

前
 
次
 

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固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

サンプルを使用するには、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クラスで定義されている、ネストしたenumクラスからインポートされています。

    図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固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプル・ページからオンラインで入手できます。

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に示すように、ファイルから直接ディクショナリの読取りまたは書込みを行う場合は、必ずエンコーディングをUTF-8に設定します。そうでない場合、ディクショナリで使用するUnicode文字が破損してしまいます。UTF-8オプションは、FileInputStreamまたはOutputStreamWriterコンストラクタ内で明示的に設定する必要があります。FileReaderFileWriterなどのJavaクラスは使用できません。これらのクラスはプラットフォームのデフォルト・エンコーディングを常に使用しており、それは通常はUnicodeバリアントではなくASCIIバリアントだからです。

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

private static RuleDictionary loadRuleDictionary(){ 
        RuleDictionary dict = null; 
        BufferedReader reader = null; 
        try { 
            reader = new BufferedReader( 
                        new InputStreamReader( 
                            new FileInputStream( 
                                new File(DICT_LOCATION)), "UTF-8")); 
            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();}} 
        } 
        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. CarRental.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";

7.6 デシジョン・ポイントとデシジョン・トレースに関する必須情報

Rules SDK APIには、デシジョン・トレース処理に役立つメソッドが含まれています。これらのメソッドは、トレース内で使用されているRL名を、関連するディクショナリで使用されている別名に置き換えるよう、デシジョン・トレースを処理します。これにより、デシジョン・トレースのネーミングとOracle Business Rulesディクショナリで使用されているネーミングとの一貫性が保たれます。

デシジョン・トレースを処理するための基本APIには、RuleDictionaryオブジェクトとDecisionTraceオブジェクトが必要です。

RuleDictionary dict = ...;
DecisionTrace trace = ...;
dict.processDecisionTrace(trace);

このコードは、別名によってディクショナリ内と同じ名前を使用するように、デシジョン・トレース内のネーミングを変換する処理コールを示しています。

Rules SDKデシジョン・ポイントAPIには、デシジョン・トレースを構成し、デシジョン・ポイントの起動時に結果のトレースを取得できるようにするメソッドが含まれています。デシジョン・ポイントから取得するトレースは、processDecisionTrace()メソッドを使用して内部処理されるので、デシジョン・ポイントからのデシジョン・トレースを使用する際、デシジョン・トレースを処理するためにこのメソッドをコールする必要はありません。

表7-2に、デシジョン・トレース・オプションを設定するためのデシジョン・ポイントAPIメソッドを示します。これらのメソッドの詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。

表7-2 デシジョン・ポイントのデシジョン・トレースのメソッド

メソッド 説明

decisionTrace

起動のためのコールから作成されたデシジョン・トレースを取得します。

DecisionTraceを戻します。

getDecisionTraceLevel

RuleSessionによって使用されるデシジョン・トレース・レベルを取得します。この値のデフォルトはDECISION_TRACE_OFFです。これはトレース情報が何も収集されていないことを意味しています。可能な値は、DECISION_TRACE_OFFです。

DECISION_TRACE_DEVELOPMENT

DECISION_TRACE_PRODUCTION

戻り型: String

getDecisionTraceLimit

デシジョン・トレースの制限、またはトレースのために取得されるトレース要素の最大数を取得します。

戻り型: int

setDecisionTraceLevel

RuleSessionによって使用されるデシジョン・トレース・レベルを設定します。このパラメータ値はStringです。可能な値は、DECISION_TRACE_OFFです。

DECISION_TRACE_DEVELOPMENT

DECISION_TRACE_PRODUCTION

setDecisionTraceLimit

デシジョン・トレースの制限、またはトレースのために取得されるトレース要素の最大数を設定します。


例7-9に、デシジョン・ポイントAPIによるデシジョン・トレースの使用例を示します。

例7-9 デシジョン・ポイントAPIからのデシジョン・トレースの使用

DecisionPoint dp = new DecisionPointBuilder()
  .with(new DictionaryFQN("com.foo", "Bar"))
  .with("MyDecisionFunction")
  .setDecisionTraceLevel(DecisionPointBuilder.DECISION_TRACE_DEVELOPMENT)
  .setDecisionTraceLimit(24000)
  .build();
 
...
 
DecisionPointInstance dpi = dp.getInstance();
 
dpi.invoke();
 
DecisionTrace trace = dpi.decisionTrace(); // with aliases replaced

デシジョン・トレースの詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』のFusion Middleware Controlコンソールでのルール実行のトレースに関する項を参照してください。