ヘッダーをスキップ

Oracle Business Rules ユーザーズ・ガイド
10g(10.1.3.1.0)

B31866-02
目次
目次
索引
索引

戻る 次へ

C Oracle Business Rulesに関するよくある質問

この付録では、Oracle Business Rulesに関するよくある質問を紹介します。質問に対する回答は、次の各カテゴリに従って提供されます。

C.1 ルール運用に関する質問

この項では、Oracle Business Rulesのルール運用のセマンティクスに関連した質問について説明します。

C.1.1 ルール・アクションのファクトの状態が、ルール条件と矛盾しているのはなぜでしょうか。

ルールのアクティブ化時間と起動(実行)時間のと間に、オブジェクトが変更されたため、そのオブジェクトは、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には、そのオブジェクトのメソッドまたはプロパティをテストまたはアクセスするルールがありません。このような場合の例には、ルール評価の結果を累計するために使用するオブジェクトがあります。


注意:

ファクトのコレクションから合計を算出するルールがあると仮定します。値が累積されているファクトを再アサートすると、その合計がファクトに含まれて正しい結果が得られません。また、合計を算出するルールも再アサートする必要があります。 


C.1.2 変更したJavaオブジェクトをファクトとしてアサートしましたが、ルールが起動しません。なぜでしょうか。

そのオブジェクトは、Rules Engineで再アサートする必要があります。Rules Engineでは、ルール条件を再評価せず、ルールもアクティブ化していません。詳細は、C.1.1項を参照してください。

C.1.3 Oracle Business Rules RL LanguageとJavaの相違は何ですか。

『Oracle Business Rulesランゲージ・リファレンス』の付録Aを参照してください。

C.1.4 Rules SDKを使用して式にNULLを含めるにはどうすればよいですか。

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
値は許可されません

C.2 Oracle Business Rulesを使用するには、どのようなJARファイルが必要ですか。

Oracle Business Rulesのサポートには、表C-1に示したJARファイルが必要です。すべてのパスは、$ORACLE_HOMEに対する相対パスです。

表 C-1    Oracle Business Rules必要なJARファイル 
JARファイル  説明 

rules/lib/rl.jar 

Oracle Business Rules Rules Engineライブラリ。インスタンス化およびRules Engineとの対話に使用するJava APIです。 

rules/lib/rl_dms.jar 

Rules Engineダイナミック・モニタリング・サービス(DMS)のサポート。RuleSessionに対してDMSが使用可能な場合、このファイルは必須です。 

rules/lib/rulesdk.jar 

Oracle Business Rules SDK。Rule Authorをプログラムで使用するためのJava APIです。 

rules/lib/webdavrc.jar 

WebDAVリポジトリのサポート用のOracle Business Rules SDKライブラリ。WebDAVリポジトリでSDKを使用する場合、このファイルは必須です。 

rules/lib/jr_dav.jar 

WebDAVクライアント・ライブラリ。WebDAVリポジトリでSDKを使用する場合、このファイルは必須です。 

jlib/oraclepki.jar 

WebDAVリポジトリなどのリポジトリで認証をサポートする場合、このファイルは必須です。 

jlib/ojpse.jar 

WebDAVリポジトリなどのリポジトリで認証をサポートする場合、このファイルは必須です。 

rules/lib/jsr94.jar 

標準JSR-94ライブラリ。 

rules/lib/jsr94_obr.jar 

Oracle Business Rules JSR-94の実装。 

lib/xml.jar 

Rules SDKで必須のファイルです。 

lib/xmlparserv2.jar 

Rules SDKで必須のファイルです。 

j2ee/home/lib/http_client.jar 

WebDAVリポジトリを使用する場合、このファイルは必須です。 

C.3 Rule AuthorをOracle以外のコンテナにデプロイするにはどうすればよいですか。

この項では、Rule AuthorとRule Authorのオンライン・ヘルプをOracle以外のコンテナにデプロイする手順を示します。

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

C.3.1 WebSphere V6.1(WAS V6.1)へのRule Authorのデプロイ

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では、Rule Authorオンライン・ヘルプは使用できません。 


WebSphereのインストール環境に管理セキュリティを構成することをお薦めします。 管理セキュリティの設定方法については、WebSphereのマニュアルを参照してください。

Rule Authorのインストールの一環として、認証および認可用に適切なユーザーおよびグループ名を構成する必要があります。 次の手順では、スタンドアロン・カスタム・レジストリを使用してWebsphere WAS V6.1のユーザーとパスワードを設定する方法の例のみを示します。 Rule Authorの本番使用では、熟練者によってセキュリティが構成されている必要があります。 データベースやLDAPなど、さらに詳しい方法の例については、該当するIBMマニュアルを参照してください。

Oracle Business Rules Rule AuthorをWebSphere V6.1にデプロイする手順は、次のとおりです。

  1. WebSphereサーバーを起動します。

    % cd <websphere home>/profiles/AppSvr01/bin
    % ./startServer.sh server1
    
    
  2. 次のURLを使用して、WebSphere管理コンソールにログインします。

    https://<host name>:9043/ibm/console/logon.jsp
    


    注意:

    グローバル・セキュリティを有効にした場合は、管理グループに属するユーザー名で管理コンソールにログインする必要があります。 


    1. ナビゲーション・ツリーで「Security」ノードをクリックして展開します。

    2. 「Secure administration, applications, and infrastructure」ノードをクリックします。

    3. 「User account repository」グループ・ボックスで、「Available realm definitions」から「Standalone custom registry」を選択し、「Set as current」をクリックします。

    4. 「Apply」をクリックします。

    5. ページの上部にある「messages」ボックスで「Save」リンクをクリックします。

    6. サーバーのファイル・システムで、WebSphereを実行するオペレーティング・システム・ユーザーのみがアクセスできるディレクトリを選択し、そのディレクトリ内にグループ・ファイルおよびユーザー・ファイルを作成します。 これによって2人のユーザーが作成されます。1人は、管理コンソールにログインする特殊権限を持つAdminGroupグループに属するadminUser、もう1人は、Rule Authorアプリケーションへのアクセス権限が付与されるruleUser1です。

      次に、グループ・ファイル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に設定されます。

    7. 「User account repository」グループ・ボックスで、「Available realm definitions」から「Standalone custom registry」を選択し、「Configure」をクリックします。

    8. 「Custom properties」リンクをクリックして、ファイルの場所を指定する2つのプロパティを設定します。

      Name Value
      ----------------------------
      groupsFile <your path>/<group file name>
      usersFile <your path>/<user file name>
      
      
    9. これらの2つのプロパティを構成した後、上部の「Standalone custom registry」リンクをクリックして、前のページに戻ります。

    10. 「Primary administrative user name」を「adminUser」に設定します。

    11. 「Server identity that is stored in the repository」ラジオ・ボタンを選択します。

    12. users.propファイルで定義済であるサーバー・ユーザーID(adminUser)およびサーバー・パスワード(welcome1)を、同名のフィールドに入力します。 ユーザー名とサーバー・パスワードは、前に指定した(手順dを参照)ユーザー・ファイルとグループ・ファイルに含まれている必要があります。

    13. 「Custom registry class name」フィールドに「com.ibm.websphere.security.FileRegistrySample」と入力します(これはデフォルト値である必要があります)。

    14. 「OK」をクリックします。

    15. 「Enable application security」ボックスを選択します。

    16. 「Use Java 2 security」ボックスが選択されている場合は解除します。 場合によっては、このボックスは前の手順でボックスを選択すると自動的に選択されるため、選択を解除する必要があります。

    17. 「Apply」ボタンをクリックします。

    18. ページの上部にある「messages」ボックスで「Save」をクリックします。

  3. 左列の「Servers」ノードをクリックして展開し、「Application servers」をクリックします。 Rule Authorをデプロイするサーバーをクリックします。

  4. コマンドラインからstopServerおよびstartServerコマンドを使用してサーバーを停止し、再起動します。

  5. 左側のナビゲーション・パネルで「Application」→「Install New Application Node」をクリックします。 ruleauthor_websphere.earへのパスを指定し、「Next」をクリックする必要があります。

    「ApplicationName」フィールドを「Rule Author」(空白あり)から「RuleAuthor」(空白なし)に変更します。 「Next」をクリックしてから、続く2つの画面で「Next」をクリックします。 最後に「Finish」をクリックします。

    • 左側のパネルで「Environment」をクリックします。

    • 「Shared Libraries」をクリックします。

    • 「Scope」メニューから目的の有効範囲を選択します。

    • 「new」をクリックします。

    • 名前として「Oracle XDK」と入力します。

    • 「Classpath」に、「xml.jar」および「xmlparserv2.jar」ファイルへの絶対パスを入力します。これらのファイルは、デプロイしたRuleAuthor.earアプリケーションの格納場所にあります。 (「find」または「search」を使用して検索)。 パスは行ごとに1つずつ入力し、セパレータ(「:」など)は使用しません。

    • 「OK」ボタンをクリックします。

    • 「Save」をクリックします。

  6. 「Applications」領域で、「Enterpirse Applications」をクリックしてから「RuleAuthor」リンクをクリックします。

    • 「References」見出しの下で、「Shared library references」をクリックします。

    • 「RuleAuthor」エントリのチェック・ボックスを選択し、「Reference shared libraries」ボタンをクリックします。

    • 「Available」リストで「Oracle XDK」エントリを選択し、これを「Selected」リストに移動します。

    • 「OK」をクリックします。

    • 次のページで「OK」をクリックします。

  7. 「Security role to user/group mapping」をクリックします。

  8. 「Security role to user/group mapping」画面で「Select」列のチェック・ボックスを選択し、「Look up groups」ボタンをクリックします。

  9. 「Search」ボタンをクリックして選択可能なグループを表示し、ユーザー「group1」を「Available」ボックスから「Selected」ボックスに移動します。 「OK」をクリックします。

  10. 戻ったページで、「Save」をクリックします。

  11. WebSphereコンソールをログアウトします。

  12. コマンドラインからWebSphereインスタンスを停止し、再起動します。

  13. ブラウザで次のURL(デフォルト・ポートは9080)を指します。

    http://<host name>:<port>/ruleauthor

手順2でRuleAdministratorロールをマップした場合は、ページ上の任意のリンクをクリックするとRule Authorログイン・ページが表示されます。 RuleAdministratorロールを正しくマップしていない場合は、アプリケーションで直接「Repository Connection」ページが表示されます。

Oracleウォレットを使用するパスワード保護されたWebDAVリポジトリへのアクセスは、現在WebSphereでは機能しません。 WebDAVリポジトリへのパスワード保護されたアクセスは、直接指定されたユーザー名とパスワードを使用した場合のみ可能です。


注意:

XMLスキーマをインポートするには、まずxml.jarファイルおよびxmlparserv2.jarファイル(インストール済のRule Authorアプリケーション・ディレクトリ内に格納)を、Javaファクト・クラスパスに追加します。 XMLスキーマからJAXBコンパイラにより生成されるJavaクラス・ファイルは、これらのJARファイルで指定された複数のクラスに依存します。 Oracle以外のコンテナでは、これらのクラスはデフォルトでJavaファクト・クラスパスにないため、手動で追加する必要があります。 


C.3.2 WebLogic ServerへのRule Authorのデプロイ

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にデプロイする手順は、次のとおりです。


注意:

OracleAS Companion CDのDisk 2上のweblogic .earファイル、ruleauthor_weblogic.earおよびrulehelp_weblogic.earを、次のディレクトリで見つけます。

Disk2/rules/webapps/weblogic/

  1. ディレクトリruleauthorを、<bea home>の任意の場所に作成します。bea homeは、WebLogic Server 9.1のホーム・ディレクトリを示します。

  2. このディレクトリへ移動し、OracleAS Companion CDのDisk 2上にある
    ruleauthor_weblogic.earを、このディレクトリ内で次のように展開します。

    % cd ruleauthor
    % jar xvf path/Disk2/rules/webapps/weblogic/ruleauthor_weblogic.ear
    
    
  3. WebLogic Serverを次のように起動します。

    % cd <bea home>/weblogic91/samples/domains/wl_server/bin
    % startWebLogic.cmd (Windowsの場合)
    % ./startWebLogic.sh (Unixの場合)
    
    
  4. ブラウザでWebLogic Server管理コンソールを指してログインします。次に例を示します。

    http://<hostname>:7001/console/login/LoginForm.jsp

  5. 左側のパネルで「Deployments」をクリックします。

  6. 左側のパネルで「Lock & Edit」ボタンをクリックします。

  7. 「Install」ボタンをクリックします。

  8. webappディレクトリを見つけるまで、ファイル・ブラウザをナビゲートします。このディレクトリのラジオ・ボタンを選択します。指示に従ってアプリケーションをデプロイします。

  9. 左側のパネルで「Activate Changes」ボタンをクリックします。

  10. 左側のパネルで「Lock & Edit」ボタンをクリックします。

  11. 左側のパネルで「Security Realms」をクリックします。

  12. 「myrealm」をクリックします。

  13. 「Users and Groups」タブをクリックします。

  14. 「Groups」サブタブをクリックします。

  15. 「New」ボタンをクリックします。新規グループrule-administratorsを作成します。

  16. 「Users」サブタブをクリックします。

  17. 「New」ボタンをクリックします。新規ユーザーを作成します。名前を決めて入力します。たとえば、ruleadminと入力し、この新規ユーザーのパスワードを入力して、「Save」をクリックします。「Groups」タブをクリックします。シャトルを使用して、このユーザーをrule-administratorsグループに割り当てます。完了したら、「Save」をクリックします。

  18. 「Release Configuration」ボタンをクリックします。

  19. 「Deployments」ページに進んでアプリケーションを起動します。

  20. コンソールからログアウトして、ブラウザを閉じます。

  21. アプリケーションをテストするには、ブラウザを開いて次のURLに進みます。

    http://<localhost>:7001/ruleauthor/

Rule Authorのヘルプをデプロイするには、手順(1〜7)に従ってrulehelp_weblogic.earをデプロイします。ヘルプ・ページをテストするには、Rule Authorページのヘルプ・リンクをクリックします。


注意:

XMLファクトのインポートとWebDAVリポジトリ・アクセスの使用を有効にするには、コンテナ・クラスパスにOracle XDKクラスを追加します。これには、xml.jarxmlparserv2.jarCLASSPATH環境変数パスに追加して、実行中のドメインのstartWebLogic.shを更新します(Windowsの場合、更新する必要のあるファイルの名前はstartWebLogic.cmdです)。 


C.3.3 JBoss 4.0へのRule Authorのデプロイ

JBossにRule AuthorおよびRule Authorのオンライン・ヘルプをデプロイするには、まずOracle Application Serverに付属のOracleAS Companion CDのインストール・ディスクを見つける必要があります。OracleAS Companion CDのDisk 2には、サポートされているOracle以外の各コンテナ用に2つの.earファイルが含まれています。


注意1:

Rule AuthorのXMLスキーマのインポート機能を使用する場合は、JBossを実行する環境で、ファイルxml.jarおよびxmlparserv2.jarの場所を環境変数JBOSS_CLASSPATHに追加する必要があります。これらのクラスは、ORACLE_HOME/libで使用可能です。 



注意2:

JBossのもとでは、XML解析機能に互換性がないため、WebDAVリポジトリにアクセスできません。 


Rule AuthorをJBoss 4.0にデプロイする手順は、次のとおりです。


注意:

OracleAS Companion CDのDisk 2上のJBoss .earファイル、ruleauthor_jboss.earおよびrulehelp_jboss.earを、次のディレクトリで見つけます。

Disk2/rules/webapps/jboss/

  1. JDK 1.5が環境にインストールされていることを確認します。JBossは、JDK 1.4ではうまく動作しません。

  2. ruleauthor_jboss.earを<jboss home>/server/default/deployディレクトリに挿入します。

  3. 次のjarsを<jboss home>/server/default/libディレクトリに挿入します。これらは、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
    
    
  4. <jboss home>/server/default/conf/login-config.xmlを編集して、次のセクションを追加します。

    <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>
    
    
  5. ユーザー(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を作成しています。

  6. 次のコマンドを使用してJBossを起動します。

    %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
    
    
  7. ブラウザで次のサイトを参照します。

    http://<host>:8080/ruleauthor

    手順2と3でRuleAdministatorロールをマッピングした場合は、Rule Authorのログイン・ページが表示されます。

Rule Authorのヘルプをデプロイするには、rulehelp_jboss.earをデプロイ・ディレクトリにドロップします。ヘルプ・ページをテストするには、Rule Authorページのヘルプ・リンクをクリックします。

C.4 RuleSessionでは並行性と同期化はどのように処理されますか。

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で示すように進むことがあります。

例 C-1    Oracle Business Rulesにおける共有RuleSessionオブジェクトの使用

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にあるような、共有オブジェクトに関するコード、プロデューサ・コードおよびコンシューマ・コードです。

例 C-2    RuleSessionの共有オブジェクト

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オブジェクトを共有している場合、複数のスレッドがrunメソッドをコールすることはお薦めしません。 


C.5 Oracle Business Rulesのランタイム・パフォーマンスを向上させるにはどうすればよいですか。

RuleSessionオブジェクトを使用するアプリケーションのパフォーマンスを向上させるには、リポジトリを開いてRLコードを生成する回数を最小限に抑えるようにする必要があります。したがって、作成した各RuleSessionインスタンスのリポジトリを開いて読み取ることを回避します。これにより、ほとんどの場合、プログラムのパフォーマンスは向上します。

生成されたRLコードを含むStringオブジェクトを共有できるため、すべてのアプリケーション・インスタンスがこれを使用して、ルールをプライベートなRuleSessionオブジェクトにロードできます。

アプリケーションでさらにパフォーマンスを調整する必要がある場合は、プーリング・メカニズムを使用して、一連のRuleSessionオブジェクトを共有できます。この場合、共通プールはRuleSessionオブジェクトを保持し、スレッドはプールからオブジェクトを取得して、一連の操作にこのオブジェクトを使用して、オブジェクトをプールに戻すことができます。例外をスローするRuleSessionオブジェクトは再使用できません。例外がRuleSessionによってスローされた場合、プールはこのインスタンスを破棄して新しいRuleSessionインスタンスと置換する必要があります。

プールされたRuleSessionオブジェクトを使用する場合は、次の問題に注意してください。

使用するアプリケーションの計算要件によっては、プーリングによるパフォーマンスの向上がほとんどみられない場合があります。RuleSessionオブジェクトの新規作成とRLコードのロードにかかる計算コストがパフォーマンスのボトルネックになることはほとんどありません。パフォーマンスを監視して、それが許容できる範囲内であるかどうかを確認してから、RuleSessionオブジェクトのプーリングを使用してパフォーマンスを向上させるようにしてください。

Oracle Java Object Cacheには、非常に簡単なプーリングのメカニズムが備わっています。ただし、reset()をコールしてRuleSessionオブジェクトの破棄と再作成を必要とする例外があるかどうかをチェックするためのレイヤーを追加する必要があります。

関連項目:

『Oracle Containers for J2EEサービス・ガイド』のJava Object Cacheを参照してください。 

C.6 RL Languageのクロス積の正しい使用方法を教えてください。

ファクトのクロス積を使用した場合、RL Languageのランタイム動作で極端な結果が生成されることがあります。

例C-5のRL Languageコードについて考えます。

例 C-5    ファクトFを使用するクロス積

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に示すように、テスト内に追加語句が必要になります。

例 C-6    ファクトFのすべての組合せの検索

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に示したコードを使用するものです。

例 C-7    ファクトFの組合せの検索

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値を使用する同じルールを示しています。

例 C-8    高速の完全比較

rule r1 { 
  if (fact F F1 && fact F F2 && F1.oid < F2.oid) { 
    println("Results: " + F1.i + ", " + F2.i); 
  }
}

この問題は、例C-9で示した関数を使用して、Oracle Rules Engineからすべての重複するファクトを削除しようとした場合にも生じることがあります。

例 C-9    重複するファクトを取り消す不正な例

rule rRemoveDups { 
  if (fact F F1 && fact F F2 && F1.i == F2.i) { 
     retract(F2); 
  } 
} 

ただし、このルールは重複だけではなくタイプFのすべてのファクトを削除します。これは、F1およびF2が同じファクト・インスタンスである場合があるためです。例C-10は、このルールの正しいバージョンを示しています。

例 C-10    重複するファクトを取り消す修正された例

rule rRemoveDups { 
  if (fact F F1 && fact F F2 && F1 != F2 && F1.i == F2.i) { 
     retract(F2); 
  } 
}

C.7 URLを使用してディクショナリのルールにアクセスするにはどうすればよいですか。

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
表 C-2    URLを使用してルールにアクセスするためのURLパラメータ 
URLコンポーネント  説明 

host_name 

Rule Authorアプリケーションが動作中のホストを指定します。 

port_number 

Rule Authorアプリケーションが動作中のポート番号を指定します。 

repos_prop i 

Oracle Business Rules SDKによって定義されたリポジトリ接続プロパティiを示します。追加の詳細は、Javadocを参照してください。

ファイル・タイプ・リポジトリについては、oracle.rules.sdk.store.jar.Constants.javaを参照してください。

WebDAVについては、oracle.rules.sdk.store.webdav.Constants.javaを参照してください。 

repos_value val 

プロパティiのリポジトリ接続値valを示します。 

dict_version 

ディクショナリ名を指定します。 

ruleset_name 

(オプション)ルールセット名を指定します。<ruleset_name>または<rule_name>のいずれも指定しない場合は、「ルールセット・サマリー」ページが表示されます。 

rule_name 

(オプション)ルール名を指定します。<ruleset_name>を設定して、<rule_name>を指定しない場合は、「ルールセット」ページが表示されます。 

C.8 Oracle Business Rulesではプロパティ変更リスナーをどのように使用しますか。

Oracle Rules Engineは、Java PropertyChangeListener設計パターンをサポートしています。これにより、PropertyChangeSupportクラスを使用するJavaファクトのインスタンスは、プロパティ値が変更されたときに自動的にOracle Rules Engineに通知できます。Javaファクトは、Oracle Rules Engineによって使用されるこのパターンを実装するために必要とされません。

通常、以前にOracle Rules Engineに対してアサートされたJavaオブジェクトのプロパティの値に変更が加えられた場合は、ルールを新しいプロパティ値によって再評価するために、オブジェクトを再アサートする必要があります。PropertyChangeEventsを起動するプロパティの場合、これらのプロパティの値を変更すると、値が変更されて、ファクトがOracle Rules Engineに対して再アサートされます。

PropertyChangeListener設計パターンをクラスに実装する手順は次のとおりです。

  1. このパッケージをクラスにインポートします。

    import java.beans.PropertyChangeSupport;
    
    
  2. プライベート・メンバー変数をクラスに追加します。

    private PropertyChangeSupport m_pcs = null;
    
    
  3. コンストラクタで、Property Change Supportオブジェクトを作成します。

    m_pcs = new PropertyChangeSupport(this);
    
    
  4. 次の各setterに対して、firePropertyChangeへのコールを追加します。

    public void setName( String name ){
       String oldVal =  m_name;
       m_name = name;
       m_pcs.firePropertyChange( "name", oldVal, m_name );
    }
    
    
  5. addPropertyChangeListenerメソッドを実装します(m_pcsに委任します)。

    public void addPropertyChangeListener(PropertyChangeListener pcl){
         m_pcs.addPropertyChangeListener( pcl );
    }
    
    
  6. removePropertyChangeListenerメソッドを実装します(m_pcsに委任します)。

    public removePropertyChangeListener(PropertyChangeListener pcl){
       m_pcs.removePropertyChangeListener( pcl );
    }
    
    

変更されたオブジェクトを常に明示的に再アサートするか、またはPropertyChangeListener設計パターンを実装するか、どちらにアプリケーションを設計するかを決定する場合は、次の項目について考慮してください。

C.9 Oracle Application ServerでのSingle Sign-Onタイムアウトを変更するにはどうすればよいですか。

Rule Authorを含めて、アプリケーションに指定されたデフォルトのOracle Single Sign-Onタイムアウトの値がインストール環境で低すぎることがわかった場合は、このタイムアウトに指定された値を変更できます。

Single Sign-Onのタイムアウトを変更する手順は、次のとおりです。

  1. Application Server Controlで、「クラスタ・トポロジ」ページに進みます。

  2. 「管理」領域で、「Java SSO構成」をクリックします。

  3. 「プロパティ」領域で、「セッション・タイムアウト」テキスト・ボックスの値を任意のタイムアウト値に変更します。

  4. 「適用」をクリックします。

    関連項目:

    A.2項「Rule Authorのセッション・タイムアウト」 

C.10 Oracle Business Rulesに高可用性は備わっていますか。

ルール・アプリケーションを高可用性アプリケーションとして実行する必要がある場合は、Oracle Business Rulesおよび高可用性について、『Oracle Application Server高可用性ガイド』を参照してください。


戻る 次へ
Oracle
Copyright © 2005, 2006, Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引