8 スタンドアロン(非SOA/BPM)シナリオでのルールの使用
スタンドアロン(非SOA/BPM)シナリオでルールを使用する場合、RuleSessionルールを作成するか、デシジョン・ポイントAPIを使用できます。
RulesSessionオブジェクトの使用方法の詳細は、『Oracle Business Process Managementルール言語リファレンス』のRuleSessionの使用方法に関する項を参照してください。
デシジョン・ポイントAPIの使用方法の詳細は、「Rules SDKデシジョン・ポイントAPIの概要」を参照してください。
この章で示されているAPIの詳細は、Oracle Business Rules Java APIリファレンスを参照してください。
8.1 リポジトリからのディクショナリのロード
非SCA (SOA/BPM)アプリケーションは、そのアプリケーションによって使用されるルール・ディクショナリをパッケージ化し、そのアプリケーションがデプロイされるときにそれらがMDSリポジトリにコピーされるようにします。実行時にディクショナリを使用するためには、MDSから取得する必要があります。
基本的なアクセス方法は、RuleRepository APIを使用してディクショナリにアクセスすることです。単純な仕様例を次に示します。
RuleRepository rr = RepositoryManager.getMDSRuleRepository(null); // pkg and name are the dictionary package and name (Strings). // Alternatively you could construct a DictionaryFQN RuleDictionary rd = rr.load(pkg, name); // if this is an editing session, edit session occurs and // then save it when done. rr.save(rd); // when the RuleRepository will not be used again it must be closed. rr.close();
一般的に、ディクショナリが変更されたときにアプリケーションが反応してディクショナリをリロードし、新しいルール定義の使用を開始する必要があります。リンクされたディクショナリが使用されている場合、ディクショナリのリロードの必要性の検知は複雑です。それは、ルート・ディクショナリでないものが変更されることがあるためです。
そのような場合、ルールを実行するためのディクショナリのロードに推奨されるメカニズムは、oracle.rules.sdk2.repository.DictionaryLoaderクラスです。DictionaryLoaderは、リンクされたディクショナリなどロードされたディクショナリを追跡し、ロード済のディクショナリをリロードする必要がある場合を判別できます。DictionaryLoaderは、DictionaryFinderインスタンスを使用して、すべてのディクショナリをロードします。DictionaryFinderが、ディクショナリを見つけるために呼び出される順序でaddFinderメソッドによってDictionaryLoaderインスタンスに追加されます。つまり、最初に追加されるファインダが、ディクショナリのロードを最初に試みることになります。DictionaryLoaderに目的のDictionaryFinderがすべて追加されたら、loadDictionary()メソッドが使用されてディクショナリがロードされます。reloadNeededメソッドを呼び出して、ディクショナリをリロードする必要があるかどうかを判別することができます。
// // A RuleRepository instance is needed for its built-in DictionaryFinder // RuleRepository rr = RepositoryManager.getMDSRuleRepository(null); DictionaryFinder rrf = rr.getDictionaryFinder(); // // Create the dictionary loader // DictionaryLoader dloader = new DictionaryLoader(); dloader.addFinder(rrf); // // If the DecisionPointDictionaryFinder is required, add it // dloader.addFinder(new DecisionPointDictionaryFinder()); // // Load the dictionary // DictionaryFQN fqn = new DictionaryFQN("somepackage", "myDictionary"); RuleDictionary rd = dloader.loadDictionary(fqn); // // Check if the dictionary needs to be reloaded // if (dloader.reloadNeeded(fqn)) rd = dloader.loadDictionary(fqn); // // When usage is complete, the RuleRepository must be closed. // rr.close();
8.2 ルール・ディクショナリの実行
RuleDictionaryからRuleSessionPoolを初期化するには、RuleSessioPoolの初期化と、デシジョン・ポイントAPIの使用の2つの方法があります。
詳細は、「Rules SDKデシジョン・ポイントAPIの概要」を参照してください
ルール実行のために初期化する場合、RuleDictionaryがロードされると、RuleSessionPoolはディクショナリから生成されたRLで初期化されます。
詳細は、『Oracle Business Process Managementルール言語リファレンス』のRuleSessionプールの使用方法に関する項を参照してください。
1つのデシジョン関数が呼び出される場合は、そのデシジョン関数によって参照されるルール・セットのみをロードすることが最も効率的です。RuleSessionPoolコンストラクタに渡されるRLテキストのリストを構築するサンプル・コードを次に示します。
簡潔にするために、エラー・チェックおよび例外処理は表示していないことに注意してください。
RuleDictionary rd; // previously loaded dictionary String dfAlias = "Alias for my Decision Function"; DecisionFunction df = rd.getCombinedDataModel().getDecisionFunctionByAlias(dfAlias); List<String> rlList = new ArrayList<String>(); // // Add the RL for the data model // rlList.add(rd.dataModelRL()); // // Add the RL for each rule set referenced by the decision function // Collection<String> rsal = df.getRuleSets(); for (String alias : rsal) { rlList.add(rd.ruleSetRL(alias)); }
同じRuleSessionPoolから複数のデシジョン関数が呼び出される場合、各デシジョン関数によって参照されるルールセットのRLを追加することでこれが可能になます。同じルールセットを2回追加しないように注意してください。
ルールを使用して実行時に実行する他のルールセットを動的に選択するなど他のシナリオでは、ディクショナリ内のルールセットをすべてロードすることが必要になります。これを実行するサンプル・コードを、次に示します。
RuleDictionary rd; // previously loaded dictionary List<String> rlList = new ArrayList<String>(); // // Add the RL for the data model // rlList.add(rd.dataModelRL()); // // Add the RL for each rule set referenced by the decision function // Collection<String> rsal = rd.getRuleSetAliases(true); for (String alias : rsal) { rlList.add(rd.ruleSetRL(alias)); }
8.3 Rules SDKデシジョン・ポイントAPIの概要
Oracle Business Rules SDK(Rules SDK)を使用して、Oracle Business Rulesのディクショナリのルールにアクセスしたり、ルールを作成、変更および実行したり、ディクショナリの内容を操作するアプリケーションを記述できます。Rules SDKの概要を取得して、Rules SDKデシジョン・ポイントAPIの使用方法を学習します。
Rules SDKは、次の4つの領域で構成されています。
-
エンジン: ルール実行の準備をします。
-
ストレージ: ルールのディクショナリとリポジトリへのアクセスを提供します。
-
編集: ディクショナリ・コンポーネントの作成と変更をプログラムで行えるようにします。
-
デシジョン・ポイント: ディクショナリにアクセスしたりデシジョン関数を実行するためのインタフェースを提供します。
説明以外の目的でRules SDKのこれらの領域が明示的に区別されることはありません。たとえば、ルールを編集するには、Rules SDKのストレージ領域を使用して、ディクショナリにもアクセスする必要があります。Rules SDKがこれらの領域に分割されているのは、個別のRules SDK APIを説明するためではなく、各種の使用モードを説明しやすくするためです。
8.3.1 デシジョン・ポイントAPIの使用
デシジョン・ポイントAPIを使用すると、ルールを簡単に実行できます。ほとんどのユーザーは、Oracle JDeveloperのルール・デザイナ拡張機能を使用して、データ・モデル要素、ルール、デシジョン表、ルールセットなどのOracle Business Rulesアーティファクトを作成します。したがって、ほとんどのユーザーは、Rules SDKのエンジン、ストレージまたは編集機能を直接使用する必要はありません。
Rules SDKのデシジョン・ポイント・パッケージを使用するには、次の3つの重要なクラスを理解する必要があります。
-
DecisionPoint
: ファクトリの設計パターンに従ってDecisionPointInstance
のインスタンスを作成するヘルパー・クラスです。ほとんどのアプリケーションには、すべてのアプリケーション・スレッドで共有されるDecisionPoint
オブジェクトが1つ必要です。コール元はDecisionPoint
のgetInstance()
メソッドを使用して、定義済デシジョン・ポイントのコールに使用できるDecisionPointInstance
のインスタンスを取得します。 -
DecisionPointBuilder
: ビルダーの設計パターンに従ってデシジョン・ポイントを作成します。 -
DecisionPointInstance
: ユーザーはこのクラスのinvoke()
をコールしてファクトをアサートし、デシジョン関数を実行します。
DecisionPoint
クラスでは、流れるようなインタフェース・モデルがサポートされているため、メソッドを連鎖させることができます。詳細は、次の章を参照してください。
http://www.martinfowler.com/bliki/FluentInterface.html
デシジョン・ポイントは、次のようなルール実行のいくつかの側面を管理します。
-
oracle.rules.rl.RuleSession
オブジェクトの使用 -
ディクショナリ更新時のディクショナリのリロード
Javaアプリケーションのデシジョン・ポイントを作成するために必要なものは次のとおりです。
-
MDSリポジトリからロードするディクショナリまたは事前ロード済の
oracle.rules.sdk2.dictionary.RuleDictionary
インスタンスの名前。 -
指定したディクショナリに格納されているデシジョン関数の名前。
8.3.2 レンタカー・サンプル・アプリケーションの入手方法
この章では、Rules SDKとデシジョン・ポイントAPIの使用方法を示すレンタカー・アプリケーションについて説明します。このサンプル・アプリケーションは、CarRentalApplication.zip
というZIPファイルで入手できます。このZIPファイルには、完全なJDeveloperアプリケーションとプロジェクトが含まれています。
Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプルおよびチュートリアル・ページからオンラインで入手できます。
サンプルを使用するには、CarRentalApplication.zip
を適切なディレクトリに解凍します。レンタカー・アプリケーションのプロジェクトには、ルール・ディクショナリおよびRules SDKを使用したいくつかのJavaサンプルが含まれています。
例についての詳細は、「等級サンプル・アプリケーションの概要」を参照してください。
8.3.3 レンタカー・サンプル・アプリケーションとプロジェクトを開く方法
レンタカー・サンプル・アプリケーションにより、Rules SDKデシジョン・ポイントAPIの使用方法がわかります。
レンタカー・サンプル・アプリケーションを開くには:
- Oracle JDeveloperを起動します。
- サンプルを解凍したディレクトリにあるレンタカー・アプリケーションを開きます。たとえば、「ファイル」メニューから「開く」を選択し、「開く」ダイアログでCarRentalApplicationフォルダにナビゲートします。
- 「開く」ダイアログで「CarRentalApplication.jws」を選択し、「開く」をクリックします。
- 「アプリケーション・ナビゲータ」で「CarRentalApplication」を開き、「アプリケーション・ソース」と「リソース」を開きます。
CarRental.rules
という名前のOracle Business RulesディクショナリといくつかのJavaソース・ファイルが表示されます。
8.4 デシジョン・ポイントで使用するディクショナリの作成
開発環境で作業する場合は、事前ロード済のディクショナリ・シグネチャでデシジョン・ポイントAPIを使用できます。本番環境では、一般にMDSリポジトリ・シグネチャでデシジョン・ポイントを使用します。
デシジョン・ポイントAPIを使用するには、デシジョン関数を含むディクショナリを作成する必要があります(レンタカー・サンプル・アプリケーションには、事前定義済のディクショナリとデシジョン関数が用意されています)。CarRentalディクショナリが事前に定義されており、レンタカー・サンプル・アプリケーションで使用できます。レンタカー・サンプルでは、事前ロード済のOracle Business RulesディクショナリまたはMDSに格納されているリポジトリでRules SDKデシジョン・ポイントAPIを使用します。
ディクショナリとデシジョン関数を作成するには、次のタスクを実行します。
8.4.1 デシジョン・ポイントで使用するデータ・モデル要素の作成方法
ノート:
スクリーン・ショットは、前のバージョンを反映していますが、内容は現在のリリースにも当てはまります。
デシジョン・ポイントを使用してアプリケーションを作成する場合、デシジョン関数に追加する次のディクショナリが必要になります。
-
ルールまたはデシジョン表の作成に使用するデータ・モデル要素を含むディクショナリ。ADFビジネス・コンポーネント・ファクト・タイプを使用する場合は、デシジョン・ポイント・サポート・ディクショナリのリンクを追加する必要があります。詳細は、データ・モデル要素の使用を参照してください。詳細は、Oracle Business RulesとADFビジネス・コンポーネントの使用を参照してください。
-
ファクト定義を含むディクショナリ。詳細は、「ファクトと値セットの使用」を参照してください。
サンプル・アプリケーションのデータ・モデルを表示するには:
Rules SDKのデシジョン・ポイントを使用する場合は、指定したディクショナリ内のデシジョン関数をコールします。コールするデシジョン関数には、デシジョン・ポイントの一部として実行される1つ以上のルールセットを含めることができます。
同じく、用意されているレンタカー・サンプル・アプリケーションのルールセットを表示するには、ルール・デザイナでCarRentalApplicationを展開します。CarRentalApplicationで、「リソース」を展開し、「CarRental.rules」をダブルクリックします
8.4.2 デシジョン・ポイントからコールするデシジョン関数の表示方法
デシジョン・ポイントAPIを使用する場合は、デシジョン関数を使用してOracle Business Rulesディクショナリを公開します。デシジョン関数の詳細は、デシジョン関数の使用を参照してください。
レンタカー・サンプル・アプリケーションのデシジョン関数を表示するには:
8.4.3 デシジョン関数のルールまたはデシジョン表の作成方法
レンタカー・サンプルには2つのルールセットが含まれています。一方にはIF/THENルール、もう一方にはデシジョン表が含まれています。デシジョン・ポイントの使用時は、IF/THENルールかデシジョン表のいずれか、または両方をアプリケーションで使用できます。
レンタカー・サンプル・アプリケーションのルールを表示するには:
8.4.4 デシジョン表を使用したレンタカー・サンプルの使用に関する必知事項
レンタカー・サンプル・アプリケーションには、「Denial Rules: decision table」ルールセットが含まれています。用意されているデシジョン関数サンプルでデシジョン表を使用するように切り替えるには、図8-6に示すように、デシジョン関数の「選択済」領域から「Denial Rules:if-then」を移動し、デシジョン表を使用して同様のルールを定義する「Denial Rules: decision table」ルールセットをこの領域に追加します。
8.5 Rules SDKデシジョン・ポイントを使用したJavaアプリケーションの作成
開発環境でRules SDKを使用する場合は、事前ロード済のディクショナリでデシジョン・ポイントAPIを使用できます。本番環境では、一般にMDSリポジトリ・シグネチャでデシジョン・ポイントAPIを使用し、ディクショナリはMDSに格納されます。
デシジョン・ポイントの使用方法の詳細は、「本番環境でのデシジョン・ポイントの使用に関する必知事項」を参照してください。
Oracle Business Rules固有のサンプルとSOAのサンプルのソースコードは、Oracle SOA Suiteのサンプルおよびチュートリアル・ページからオンラインで入手できます。
CarRentalProjectプロジェクトには、レンタカー・サンプル・ファイルのCarRentalWithDecisionPointUsingPreloadedDictionary.java
.
を含むcom.example.rules.demo
パッケージが含まれています。また、デシジョン・ポイントの様々な使用方法をサポートするいくつかの.java
ソース・ファイルも含まれています。表8-1に、レンタカー・サンプルの様々なバージョンのサマリーを示します。
表8-1 デシジョン・ポイント・サンプルCarRentalProject内のJavaファイル
ベースJavaファイル名 | 説明 |
---|---|
|
これはすべてのサンプルのベース・クラスです。CarRentalディクショナリおよび |
|
|
|
MDSを使用してルール・ディクショナリのアクセスとロードを行うデシジョン・ポイントの作成サンプルが含まれています。本番環境では、ほとんどのアプリケーションはデシジョン・ポイントAPIをMDSで使用します。 |
|
|
|
エンジンAPIの高度な使用サンプルが含まれています。詳細はコメントに記述されています。 |
|
エンジンAPIの高度な使用サンプルが含まれています。詳細はコメントに記述されています。 |
|
ルールとデシジョン表の作成に使用される |
|
ルールとデシジョン表の作成に使用される |
|
同時ユーザーによるデシジョン・ポイントの起動をシミュレートするスレッドとして使用できるクラスが含まれています。 |
8.5.1 デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法
デシジョン・ポイントを使用するには、次の例に示すように、DecisionPointBuilder
を使用してDecisionPoint
インスタンスを作成します。
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(); } }
前の例は、DecisionPointBuilder
が流れるようなインタフェース・パターンをサポートしているため、デシジョン・ポイントの作成時にすべてのメソッドを容易に連鎖させることができることを示しています。DecisionPointBuilder
でデシジョン・ポイントを構成するための最も一般的な3つのメソッドは、with()
という名前を持つようにオーバーロードされます。各with()
メソッドは、RuleDictionary
型、DictionaryFQN
型またはString
型の単一の引数を使用します。DecisionPointBuilder
は、類似のsetメソッドとgetメソッド(getDecisionFunction()
、setDecisionFunction()
、getDictionary()
、setDictionary()
、getDictionaryFQN()
、setDictionaryFQN()
)もサポートしています。
前の例に示すこの連鎖には、次のステップが含まれています。
DecisionPoint
インスタンスは、アプリケーションのすべてのインスタンス間で共有されます。このためこのインスタンスは静的な属性で、静的なブロック内で作成されます。DecisionPoint
を初期化する別の方法としては、DecisionPoint
インスタンスを作成して戻した静的なメソッドを使用して、m_decisionPoint
属性を初期化することが考えられます。
8.5.2 事前ロード済のディクショナリでデシジョン・ポイントを使用する方法
例8-1に、ファイルからRuleDictionaryのインスタンスをロードするloadRuleDictionary()
メソッドを示します。
例8-1に示すように、ファイルから直接ディクショナリの読取りまたは書込みを行う場合は、必ずエンコーディングをUTF-8
に設定します。そうでない場合、ディクショナリで使用するUnicode文字が破損してしまいます。UTF-8
オプションは、FileInputStream
またはOutputStreamWriter
コンストラクタ内で明示的に設定する必要があります。FileReader
やFileWriter
などのJavaクラスは使用できません。これらのクラスはプラットフォームのデフォルト・エンコーディングを常に使用しており、それは通常はUnicodeバリアントではなくASCIIバリアントだからです。
例8-1 ルール・ディクショナリのロード・メソッド
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; }
8.5.3 エグゼキュータ・サービスを使用してデシジョン・ポイントでスレッドを実行する方法
レンタカー・サンプルでは、Oracle Business Rulesを使用して複数の同時ユーザーをシミュレートできます。次のコード例に、JavaのExecutorService
インタフェースを使用して、デシジョン・ポイントを起動する複数のスレッドを実行する方法を示します。ExecutorService
は、Rules SDKデシジョン・ポイントAPIに含まれていません。
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)); }
前の例には、サンプル・アプリケーションの次のコードが含まれています。
-
エグゼキュータ・サービスを作成します。
ExecutorService exec = Executors.newCachedThreadPool();
-
CarRental.java
に定義されているcreateDrivers()
メソッドをコールして、Driver
インスタンスのリストを作成します。List<Driver> drivers = createDrivers();
-
Driver
インスタンスのリストをループしてdriverリストに運転者を格納します。 -
ループで
DriverCheckerRunnable
インスタンスから複数のスレッドを開始します。これらのインスタンスはデシジョン・ポイントを開き、各運転者に対してルールを実行します。このコードの詳細は、「デシジョン・ポイント・インスタンスの作成および使用方法」を参照してください。
次のコード例は、スレッドの完了を待機するコードです。
try { exec.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } exec.shutdown(); }
8.5.4 デシジョン・ポイント・インスタンスの作成および使用方法
DriverCheckerRunnable
インスタンスはcheckDriver()
メソッドをコールします。例8-2に、CarRentalWithDecisionPoint
で定義されているcheckDriver()
メソッドを示します。checkDriver()
メソッドは、Driver
インスタンスによるデシジョン・ポイントの起動を処理します。
例8-2は、次のことを示しています。
-
次のコードにより、
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()); } }
8.5.4.1 getInstance()でデシジョン・ポイント・インスタンスを作成するサンプル・コード
DriverCheckerRunnable
インスタンスはcheckDriver()
メソッドをコールします。例8-2に、CarRentalWithDecisionPoint
で定義されているcheckDriver()
メソッドを示します。checkDriver()
メソッドは、Driver
インスタンスによるデシジョン・ポイントの起動を処理します。
例8-2 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(); } } }
8.6 レンタカー・サンプルの実行
レンタカー・サンプルを実行する前に、システムでディクショナリの場所を合せます。
DICT_LOCATION
の値をシステムのディクショナリの場所にあわせて変更します。
システムでレンタカー・サンプルを実行するには:
- 「アプリケーション・ナビゲータ」で、「編集」メニューから「パスのコピー」を選択します。
CarRental.java
ファイルで、パスの値をDICT_LOCATION
の値に貼り付けます。- CarRentalProjectで、CarRentalWithDecisionPointUsingPreloadedDictionary.javaファイルを選択します。
- 右クリックしてリストから「実行」を選択します。
8.6.1 レンタカーのサンプル出力
例8-3に、レンタカー・アプリケーションのサンプル出力を示します。
例8-3 レンタカー・サンプルの出力
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
8.7 本番環境でのデシジョン・ポイントの使用に関する必知事項
本番環境では、MDSリポジトリを使用してOracle Business Rulesのディクショナリを格納できます。
MDSリポジトリを使用してディクショナリを格納する場合は、「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」と「事前ロード済のディクショナリでデシジョン・ポイントを使用する方法」で示したステップが、ディクショナリにアクセスするように変わります。CarRentalWithDecisionPointUsingMdsRepository
に、MDSでデシジョン・ポイントを使用するためのサンプル・コードを示します。
デシジョン・ポイントを使用してMDSのディクショナリにアクセスする方法を示すデプロイメント・ステップの完全なサンプルは、「Rules SDKコールを含む等級アプリケーションのサーブレットの追加」を参照してください。
次のコード例は、DecisionPointBuilder
と一緒にDictionaryFQN
を使用してMDSリポジトリのディクショナリにアクセスする方法を示します。完全なサンプルは、CarRentalWithDecisionPointUsingMdsRepository
のサンプル・コードにあります。
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());
「デシジョン・ポイント・ビルダーを使用したデシジョン・ポイントの追加方法」の項のステップと同様に、前の例では次のことを示しています。
-
最初のステップで、次のコードにより
DecisionPointBuilder
インスタンスを作成します。new DecisionPointBuilder()
-
String
引数を使用するwith()
メソッドで、デシジョン・ポイントによって実行されるデシジョン関数の名前を定義します。このメソッドのコールは必須です。.with(DF_NAME)
DF_NAME
には、アプリケーションで定義したデシジョン関数の名前を指定します。たとえば、レンタカー・サンプル・アプリケーションでは、これはCarRental.java
でCarRentalDecisionFunction
と定義されています。 -
これ以外の2つの
with()
メソッドのうち、いずれか1つのみをコールします。このサンプル・コードでは、DictionaryFQN
をコールしてMDSリポジトリにアクセスします。ステップ4のコード例は、ディクショナリ・パッケージとディクショナリ名を使用してDictionaryFQN
を作成するルーティングを示します。.with(DICT_FQN)
-
DecisionPoint
インスタンスを作成して戻すために、build()
メソッドをコールします。
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";
8.8 デシジョン・ポイントとデシジョン・トレースに関する必知事項
Rules SDK APIには、デシジョン・トレース処理に役立つメソッドが含まれています。これらのメソッドは、トレース内で使用されているRL名を、関連するディクショナリで使用されている別名に置き換えるよう、デシジョン・トレースを処理します。これにより、デシジョン・トレースのネーミングとOracle Business Rulesディクショナリで使用されているネーミングとの一貫性が保たれます。
デシジョン・トレースを処理するための基本APIには、RuleDictionary
オブジェクトとDecisionTrace
オブジェクトが必要です。
RuleDictionary dict = ...; DecisionTrace trace = ...; dict.processDecisionTrace(trace);
このコードは、別名によってディクショナリ内と同じ名前を使用するように、デシジョン・トレース内のネーミングを変換する処理コールを示しています。
Rules SDKデシジョン・ポイントAPIには、デシジョン・トレースを構成し、デシジョン・ポイントの起動時に結果のトレースを取得できるようにするメソッドが含まれています。
表8-2に、デシジョン・トレース・オプションを設定するためのデシジョン・ポイントAPIメソッドを示します。
表8-2 デシジョン・ポイントのデシジョン・トレースのメソッド
方法 | 説明 |
---|---|
|
起動のためのコールから作成されたデシジョン・トレースを取得します。
|
|
RuleSessionによって使用されるデシジョン・トレース・レベルを取得します。この値のデフォルトは
戻り型: String |
|
デシジョン・トレースの制限、またはトレースのために取得されるトレース要素の最大数を取得します。 戻り型: int |
|
RuleSessionによって使用されるデシジョン・トレース・レベルを設定します。このパラメータ値はStringです。可能な値は、
|
|
デシジョン・トレースの制限、またはトレースのために取得されるトレース要素の最大数を設定します。 |
8.8.1 デシジョン・トレースの使用例
例8-4に、デシジョン・ポイントAPIによるデシジョン・トレースの使用例を示します。
デシジョン・トレースの詳細は、『Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』のFusion Middleware Controlコンソールでのルール実行のトレースに関する項参照してください。
例8-4 デシジョン・ポイント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();