Oracle Business Rules ユーザーズ・ガイド 10g(10.1.3.1.0) B31866-02 |
|
この付録では、Oracle Business Rulesに関するよくある質問を紹介します。質問に対する回答は、次の各カテゴリに従って提供されます。
この項では、Oracle Business Rulesのルール運用のセマンティクスに関連した質問について説明します。
ルールのアクティブ化時間と起動(実行)時間のと間に、オブジェクトが変更されたため、そのオブジェクトは、Rules Engineで再度アサートされませんでした。
オブジェクト(JavaまたはRL)は、ルール評価で使用する前に、ファクトとしてRules Engineでアサートされる必要があります。ファクトとしてアサートされたオブジェクトが、ルールのアクションまたはRules Engine外部の何か(多くの場合、アプリケーション)によって変更された場合、そのオブジェクトは、現在のオブジェクト状態をRules Engineとルール評価に反映するために、Rules Engineで再度アサートされる必要があります。この操作を実行しない場合、アプリケーションはRules Engineと矛盾した状態になり、予期しない状態が発生する可能性があります。
PropertyChangeListener
をサポートするためにJava Beanを記述すると、Beanプロパティの更新時に、Rules Engineが一貫性のある状態を自動的に保持できるようになります。詳細は、1.3.4.1項「Javaファクト・タイプ定義」を参照してください。
このルールの例外は、評価されないコンテンツのオブジェクトの場合です。つまり、Rules Engineには、そのオブジェクトのメソッドまたはプロパティをテストまたはアクセスするルールがありません。このような場合の例には、ルール評価の結果を累計するために使用するオブジェクトがあります。
そのオブジェクトは、Rules Engineで再アサートする必要があります。Rules Engineでは、ルール条件を再評価せず、ルールもアクティブ化していません。詳細は、C.1.1項を参照してください。
『Oracle Business Rulesランゲージ・リファレンス』の付録Aを参照してください。
Rules SDKでは、文字列値に自動的に引用符が追加されます。引用符なしのNULL値など、引用符なしの値を式に含めるには、拡張式を指定します。式タイプFORM_LITERAL
では、文字列値が常に引用符で囲まれます。式タイプFORM_ADVANCED
を使用した場合は、式は引用符で囲まれません。
たとえば、次のRules SDKコードにはNULLが含まれています。
SimpleTest test = pattern.getSimpleTestTable().add(); test.getLeft().setForm(Expression.FORM_SINGLE_TERM); test.getLeft().setSingleTermValue(attr); test.setOperator(Util.TESTOP_NE); test.getRight().setForm(Expression.FORM_ADVANCED); test.getRight().getAdvancedExpression().append("null");
FORM_ADVANCED
を使用しないと、次のエラーが表示されることがあります。
SEVERE: RUL-01815: keyまたは値put ( LiteralValue、null )にNULL値は許可されません java.lang.NullPointerException: RUL-01815: keyまたは値put ( LiteralValue、null )にNULL 値は許可されません
Oracle Business Rulesのサポートには、表C-1に示したJARファイルが必要です。すべてのパスは、$ORACLE_HOME
に対する相対パスです。
この項では、Rule AuthorとRule Authorのオンライン・ヘルプをOracle以外のコンテナにデプロイする手順を示します。
この項の内容は次のとおりです。
Rule AuthorをWebSphere V6.1にデプロイするには、まずOracle Application Serverに付属のOracleAS Companion CDのインストール・ディスクを見つけます。 OracleAS Companion CDのDisk 2には、サポートされているOracle以外の各コンテナ用に2つの.earファイルが含まれています。 WebSphere用の.earファイルは、次のディレクトリにあります。
Disk2/rules/webapps/websphere/
WebSphereのインストール環境に管理セキュリティを構成することをお薦めします。 管理セキュリティの設定方法については、WebSphereのマニュアルを参照してください。
Rule Authorのインストールの一環として、認証および認可用に適切なユーザーおよびグループ名を構成する必要があります。 次の手順では、スタンドアロン・カスタム・レジストリを使用してWebsphere WAS V6.1のユーザーとパスワードを設定する方法の例のみを示します。 Rule Authorの本番使用では、熟練者によってセキュリティが構成されている必要があります。 データベースやLDAPなど、さらに詳しい方法の例については、該当するIBMマニュアルを参照してください。
Oracle Business Rules Rule AuthorをWebSphere V6.1にデプロイする手順は、次のとおりです。
% cd <websphere home>/profiles/AppSvr01/bin % ./startServer.sh server1
https://<host name>:9043/ibm/console/logon.jsp
次に、グループ・ファイルgroups.propの内容の例を示します。
adminGroup:987:adminUser:AdminGroup ruleAdminGroup:567:ruleUser1:RuleAdminGroup
グループ・ファイルの各行には、次のものが含まれます。
<group name>:<group id>:<user name 1>, .. , <user name N>:<display name>
次に、ユーザー・ファイルusers.propの内容の例を示します。
adminUser:welcome1:123:987:WebSphereAdmin ruleUser1:welcome1:456:567:RuleAdmin
ユーザー・ファイルの各行には、次のものが含まれます。
<name>:<password>:<unique user id>:<group name 1>,...,<group name N>:<display name>
これにより、adminUserおよびruleUser1のパスワードがどちらもwelcome1に設定されます。
Name Value ---------------------------- groupsFile <your path>/<group file name> usersFile <your path>/<user file name>
stopServer
およびstartServer
コマンドを使用してサーバーを停止し、再起動します。
「ApplicationName」フィールドを「Rule Author」(空白あり)から「RuleAuthor」(空白なし)に変更します。 「Next」をクリックしてから、続く2つの画面で「Next」をクリックします。 最後に「Finish」をクリックします。
http://<host name>:<port>/ruleauthor
手順2でRuleAdministratorロールをマップした場合は、ページ上の任意のリンクをクリックするとRule Authorログイン・ページが表示されます。 RuleAdministratorロールを正しくマップしていない場合は、アプリケーションで直接「Repository Connection」ページが表示されます。
Oracleウォレットを使用するパスワード保護されたWebDAVリポジトリへのアクセスは、現在WebSphereでは機能しません。 WebDAVリポジトリへのパスワード保護されたアクセスは、直接指定されたユーザー名とパスワードを使用した場合のみ可能です。
WebLogic Server 9.1にOracle Business Rules Rule AuthorおよびRule Authorのオンライン・ヘルプをデプロイするには、まずOracle Application Serverに付属のOracleAS Companion CDのインストール・ディスクを見つける必要があります。OracleAS Companion CDのDisk 2には、サポートされているOracle以外の各コンテナ用に2つの.earファイルが含まれています。
展開したearファイルを使用してOracle Business Rules Rule AuthorをWebLogic Server 9.1にデプロイする手順は、次のとおりです。
ruleauthor
を、<bea home>の任意の場所に作成します。bea homeは、WebLogic Server 9.1のホーム・ディレクトリを示します。
ruleauthor_weblogic.ear
を、このディレクトリ内で次のように展開します。
% cd ruleauthor % jar xvf path/Disk2/rules/webapps/weblogic/ruleauthor_weblogic.ear
% cd <bea home>/weblogic91/samples/domains/wl_server/bin % startWebLogic.cmd (Windowsの場合) % ./startWebLogic.sh (Unixの場合)
http://<hostname>:7001/console/login/LoginForm.jsp
webapp
ディレクトリを見つけるまで、ファイル・ブラウザをナビゲートします。このディレクトリのラジオ・ボタンを選択します。指示に従ってアプリケーションをデプロイします。
ruleadmin
と入力し、この新規ユーザーのパスワードを入力して、「Save」をクリックします。「Groups」タブをクリックします。シャトルを使用して、このユーザーをrule-administrators
グループに割り当てます。完了したら、「Save」をクリックします。
http://<localhost>:7001/ruleauthor/
Rule Authorのヘルプをデプロイするには、手順(1〜7)に従ってrulehelp_weblogic.ear
をデプロイします。ヘルプ・ページをテストするには、Rule Authorページのヘルプ・リンクをクリックします。
JBossにRule AuthorおよびRule Authorのオンライン・ヘルプをデプロイするには、まずOracle Application Serverに付属のOracleAS Companion CDのインストール・ディスクを見つける必要があります。OracleAS Companion CDのDisk 2には、サポートされているOracle以外の各コンテナ用に2つの.earファイルが含まれています。
Rule AuthorをJBoss 4.0にデプロイする手順は、次のとおりです。
ruleauthor_jboss.ear
を<jboss home>/server/default/deployディレクトリに挿入します。
ruleauthor_jboss.ear
ファイルを一時ディレクトリで展開することによって取得できます。
commons-el.jar jr_dav.jar jsp-el-api.jar oracle-el.jar regexp.jar rulesmvc.jar rulesdk.jar rl.jar share.jar uix2.jar webdavrc.jar xmlparserv2.jar xml.jar http_client.jar oraclepki.jar servlet.jar
<application-policy name = "ruleauthor"> <authentication> <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag = "required"> <module-option name= "usersProperties"> props/ruleauthor-users.properties </module-option> <module-option name="rolesProperties"> props/ruleauthor-roles.properties </module-option> </login-module> </authentication> </application-policy>
ruleauthor-users.properties
)およびロール(ruleauthor-roles.properties
)の各ファイルを次のディレクトリに追加します。 <jboss home
>/server/default/conf/props
ruleauthor-users.properties
ファイルの内容の例:
ra=oraclerule
ruleauthor-roles.properties
ファイルの内容の例:
ra=RuleAdministrator
この例では、パスワードoraclerule
を持ち、ロールRuleAdministrator
に属するユーザー名ra
を作成しています。
%cd <jboss home>/bin %run.bat
正常にデプロイされると、次のような出力が表示されます。
14:28:21,718 INFO [TomcatDeployer] deploy,ctxPath=/ruleauthor, warUrl=.../tmp/ deploy/tmp20477ruleauthor_jboss.ear-contents/ruleauthor-exp.war/ 4:28:21,906 INFO [EARDeployer] Started J2EE application: file:/C:/jboss-4.0.3SP1/server/default/deploy/ruleauthor_jboss.ear
http://<host>:8080/ruleauthor
手順2と3でRuleAdministator
ロールをマッピングした場合は、Rule Authorのログイン・ページが表示されます。
Rule Authorのヘルプをデプロイするには、rulehelp_jboss.ear
をデプロイ・ディレクトリにドロップします。ヘルプ・ページをテストするには、Rule Authorページのヘルプ・リンクをクリックします。
Oracle Business Rules RuleSessionオブジェクトに対するメソッド・コールは、複数のスレッドによるコールによって、RuleSessionレベルでの例外が発生しないようにスレッド・セーフになっています。ただし、メソッドの実行に排他性やトランザクション保証はありません。Rules Engineの最低レベルのrun
メソッドは同期化されるため、共有RuleSession
を持つ2つのスレッドが同時にrun
を実行できません。runへの一方のコールは、もう一方のコールが終了するまで待機する必要があります。
RL関数は、デフォルトでは同期化されません。Javaメソッドと同様、RL関数は並行して実行可能であり、プログラマは同期化されたブロックを使用して共有データ(たとえば、結果データを含むHashMap
)へのアクセスを保護する必要があります。
一連のアクションがトランザクション形式のように実行されるようにするには、共有オブジェクト関連を同期化する必要があります。ユーザーは、RuleSession
オブジェクト関連は同期化しないでください。これは、RuleSession
メソッドをコールするときに出される例外が、RuleSession
オブジェクトの破棄を必要とする場合があるためです。
RuleSession
オブジェクトをOracle Business Rulesで使用するほとんどの場合、各スレッドまたはサーブレット・インスタンスは、ローカルなRuleSession
オブジェクトを作成して使用する必要があります。この使用パターンは、この方法でJDBC接続を使用した場合とおおよそ似ています。
次の例は、共有RuleSession
オブジェクトを使用する方法を示しています。
Thread-1が次のものを含む場合:
ruleSession.callFunctionWithArgument("assert", singleFact1); ruleSession.callFunctionWithArgument("assert", singleFact2);
Thread-2が次のものを含む場合:
ruleSession.callFunction("run"); ruleSession.callFunction("clear");
この場合、2つのスレッドの実行は、例C-1で示すように進むことがあります。
Thread-1: ruleSession.callFunctionWithArgument("assert", singleFact1); Thread-2: ruleSession.callFunction("run"); Thread-2: ruleSession.callFunction("clear"); Thread-1: ruleSession.callFunctionWithArgument("assert", singleFact2);
例C-1では、Thread-1がアサートした2つのファクトが両方とも、run
へのコール中にRuleSession
に存在することはありません。また、1つのスレッドのみがrun
メソッドをコールすることに注意してください。複数のスレッドが共有RuleSession
に対してrun
をコールできる設計はお薦めしません。この使用パターンによって、非常に見つけにくい不具合が作成される可能性があり、パフォーマンス上の利点はありません。
共有RuleSession
オブジェクトに対するすべてのアクセスを同期化して、意図した動作を保証する必要があります。ただし、RuleSession
インスタンスが例外をスローして回復不能になることがあるため、このオブジェクトを同期化オブジェクトとしては使用しないでください。かわりに、別の共有オブジェクトを同期点として使用します。
RuleSession
で使用する共有サーバー・プロセスのプロデューサ/コンシューマ・モデルを想定できます。このモデルでは、複数のスレッドが共有RuleSession
に対してファクトをアサートし、1つのスレッドが定期的にrun
をコールし、結果を読み取ってそれらを出力します。これにより、スレッドの対立が生じる可能性はなくなります。これは、2つのコード・セグメントを順次実行する必要があり、混在させることができないためです。たとえば、例C-2、例C-3および例C-4にあるような、共有オブジェクトに関するコード、プロデューサ・コードおよびコンシューマ・コードです。
RuleSession ruleSession; Object ruleSessionLock = new Object();例 C-3 RuleSessionのプロデューサ・コード
public String addFacts(FactTypeA fa, FactTypeB fb, FactTypeC fc){ String status = ""; synchronized(ruleSessionLock){ try { ruleSession.callFunctionWithArgument("assert", fa); ruleSession.callFunctionWithArgument("assert", fb); status = "success"; } catch (Exception e) { // a method that creates a new RuleSession loads it with rules initializeRuleSession(); status = "failure"; } return status; }例 C-4 RuleSessionのコンシューマ・コード
public List exec(){ synchronized(ruleSessionLock){ try { ruleSession.callFunction("run"); List results = (List)ruleSession.callFunction("getResults"); ruleSession.callFunction("clearResults"); return results; } catch (Exception e) { // a method that creates a new RuleSession loads it with rules initializeRuleSession(); return null; } } }
RuleSession
オブジェクトを使用するアプリケーションのパフォーマンスを向上させるには、リポジトリを開いてRLコードを生成する回数を最小限に抑えるようにする必要があります。したがって、作成した各RuleSession
インスタンスのリポジトリを開いて読み取ることを回避します。これにより、ほとんどの場合、プログラムのパフォーマンスは向上します。
生成されたRLコードを含むString
オブジェクトを共有できるため、すべてのアプリケーション・インスタンスがこれを使用して、ルールをプライベートなRuleSession
オブジェクトにロードできます。
アプリケーションでさらにパフォーマンスを調整する必要がある場合は、プーリング・メカニズムを使用して、一連のRuleSession
オブジェクトを共有できます。この場合、共通プールはRuleSession
オブジェクトを保持し、スレッドはプールからオブジェクトを取得して、一連の操作にこのオブジェクトを使用して、オブジェクトをプールに戻すことができます。例外をスローするRuleSession
オブジェクトは再使用できません。例外がRuleSession
によってスローされた場合、プールはこのインスタンスを破棄して新しいRuleSession
インスタンスと置換する必要があります。
プールされたRuleSession
オブジェクトを使用する場合は、次の問題に注意してください。
RuleSession
の状態は、再使用の前にリストアする必要があります。RL reset()
関数を使用すると便利です。reset()
でRuleSession
内の非finalグローバル変数に対してイニシャライザが再実行されるようなファクトには、特に注意してください。これは、初期ファクトを再アサートするためのフックとして使用される場合があります。
RuleSession
は再使用しないでください。これは、例外をスローするRuleSession
インスタンスの状態を確実にリストアすることが困難であるためです。
使用するアプリケーションの計算要件によっては、プーリングによるパフォーマンスの向上がほとんどみられない場合があります。RuleSession
オブジェクトの新規作成とRLコードのロードにかかる計算コストがパフォーマンスのボトルネックになることはほとんどありません。パフォーマンスを監視して、それが許容できる範囲内であるかどうかを確認してから、RuleSession
オブジェクトのプーリングを使用してパフォーマンスを向上させるようにしてください。
Oracle Java Object Cacheには、非常に簡単なプーリングのメカニズムが備わっています。ただし、reset()
をコールしてRuleSession
オブジェクトの破棄と再作成を必要とする例外があるかどうかをチェックするためのレイヤーを追加する必要があります。
ファクトのクロス積を使用した場合、RL Languageのランタイム動作で極端な結果が生成されることがあります。
例C-5のRL Languageコードについて考えます。
class F {int i; }; rule r1 { if (fact F F1 && fact F F2) { println("Results: " + F1.i + ", " + F2.i); }} assert(new F(i:1)); assert(new F(i:2)); run();
例C-5でいくつの行が出力されるか考えます。ファクトF1
とファクトF2
は同じインスタンスであり、各オペランドで比較されるため、答えは4行です。
したがって、例C-5では次の出力が生成されます。
Results: 2, 2 Results: 2, 1 Results: 1, 2 Results: 1, 1
3番目のF
のある同じ例を使用すると(たとえば、assert(new F(i:3));
)、9つの行が出力されます。また同時に、3番目の語句&& fact F F3
が追加されると、27の行が出力されます。
個別のファクトについてすべての組合せと順序を見つけようとすると、例C-6に示すように、テスト内に追加語句が必要になります。
rule r1 { if (fact F F1 && fact F F2 && F1 != F2) { println("Results: " + F1.i + ", " + F2.i); }}
例C-6のコードでは、次の出力が生成されます。
Results: 2, 1 Results: 1, 2
ファクトのすべての組合せを検出する最も簡単な方法は、最速ではなく順序も不同ですが、例C-7に示したコードを使用するものです。
rule r1 { if (fact F F1 && fact F F2 && id(F1) < id(F2)) { println("Results: " + F1.i + ", " + F2.i); } }
例C-7に示した関数id()
をテスト・パターンで実行すると直接比較よりも時間がかかるため、各オブジェクトの固有の値に対してテストする方法が最も速い方法になります。たとえば、整数値プロパティoidを、クラスの各インスタンスの固有値を割り当てられたクラスに追加できます。
例C-8は、oid値を使用する同じルールを示しています。
rule r1 { if (fact F F1 && fact F F2 && F1.oid < F2.oid) { println("Results: " + F1.i + ", " + F2.i); } }
この問題は、例C-9で示した関数を使用して、Oracle Rules Engineからすべての重複するファクトを削除しようとした場合にも生じることがあります。
rule rRemoveDups { if (fact F F1 && fact F F2 && F1.i == F2.i) { retract(F2); } }
ただし、このルールは重複だけではなくタイプF
のすべてのファクトを削除します。これは、F1
およびF2
が同じファクト・インスタンスである場合があるためです。例C-10は、このルールの正しいバージョンを示しています。
rule rRemoveDups { if (fact F F1 && fact F F2 && F1 != F2 && F1.i == F2.i) { retract(F2); } }
Rule Authorでは、URLにディクショナリとルール名を使用して、URLからルールに直接アクセスできます。ユーザーは、Rule Authorログイン・ページまたはOracle Single Sign-Onを使用してRule Authorにログインした後は、Rule AuthorでURLを使用してルールセットまたはルール・ページを表示できます。
URLの形式は次のとおりです。表C-2は、パラメータの説明を示します。
http://<host_name>:<port_number>/ruleauthor/event=dlConnect& <repos_prop 1>=<repos_value val> ..... & Dict=<dict_name>&Version=<version> & RuleSet=<ruleset_name> & rule=<rule_name>
たとえば、次のURLを使用すると、ルールセットrs2
のルールcheckCredit
を単一のURLで表示できます。
http://localhost:8888/ruleauthor/ConnectRepos.uix?event=dlConnect&ReposType=File&oracle .rules.sdk.store.jar.path=C:¥jartest¥test1.jar&Dict=c233&Version=v1&RuleSet=rs2&rule=ch eckCredit
Oracle Rules Engineは、Java PropertyChangeListener設計パターンをサポートしています。これにより、PropertyChangeSupportクラスを使用するJavaファクトのインスタンスは、プロパティ値が変更されたときに自動的にOracle Rules Engineに通知できます。Javaファクトは、Oracle Rules Engineによって使用されるこのパターンを実装するために必要とされません。
通常、以前にOracle Rules Engineに対してアサートされたJavaオブジェクトのプロパティの値に変更が加えられた場合は、ルールを新しいプロパティ値によって再評価するために、オブジェクトを再アサートする必要があります。PropertyChangeEventsを起動するプロパティの場合、これらのプロパティの値を変更すると、値が変更されて、ファクトがOracle Rules Engineに対して再アサートされます。
PropertyChangeListener設計パターンをクラスに実装する手順は次のとおりです。
import java.beans.PropertyChangeSupport;
private PropertyChangeSupport m_pcs = null;
m_pcs = new PropertyChangeSupport(this);
public void setName( String name ){ String oldVal = m_name; m_name = name; m_pcs.firePropertyChange( "name", oldVal, m_name ); }
public void addPropertyChangeListener(PropertyChangeListener pcl){ m_pcs.addPropertyChangeListener( pcl ); }
public removePropertyChangeListener(PropertyChangeListener pcl){ m_pcs.removePropertyChangeListener( pcl ); }
変更されたオブジェクトを常に明示的に再アサートするか、またはPropertyChangeListener設計パターンを実装するか、どちらにアプリケーションを設計するかを決定する場合は、次の項目について考慮してください。
Rule Authorを含めて、アプリケーションに指定されたデフォルトのOracle Single Sign-Onタイムアウトの値がインストール環境で低すぎることがわかった場合は、このタイムアウトに指定された値を変更できます。
Single Sign-Onのタイムアウトを変更する手順は、次のとおりです。
ルール・アプリケーションを高可用性アプリケーションとして実行する必要がある場合は、Oracle Business Rulesおよび高可用性について、『Oracle Application Server高可用性ガイド』を参照してください。
|
![]() Copyright © 2005, 2006, Oracle Corporation. All Rights Reserved. |
|