この章では、Oracle Business Rulesに関する問題について説明します。内容は次のとおりです。
Rule AuthorをスタンドアロンOC4Jにインストールするには、次の手順を実行します。
Rule Author EARファイルをデプロイします。Rule Author EARファイルは/Disk2/rules/webapps/ruleauthor_s.ear
に格納されています。
セキュリティ・グループ「rule-administrators」を作成します。
Rule Authorユーザー(ruleadmin
など)を作成し、このユーザーをrule-administratorsグループに追加します。
Oracle Application Serverのインストール先にある「rules」ディレクトリを、スタンドアロンOC4Jインストール環境のORACLE_HOMEへコピーします。
OC4Jを停止し、再起動します。
XMLファクトの使用時に、assertXPath
コールを試行すると次のエラーが発生する場合があります。
Oracle Business Rules RL: RL code error RLRuntimeException: fact class multiple inheritance not supported at line 1 column 1 in main caused by MultipleInheritanceException: fact class 'mypkgname.MyClassNameImpl' cannot extend both 'mypkgname.MyClassNameType' and 'mypkgname.MyClassName'
これは、生成されたRLで、ObjectFactory
のファクト・クラス宣言が他のJAXBクラスのファクト・クラス宣言よりも前にくるために発生します。
この問題に対処するには、インポートしたXMLファクト・リストからObjectFactory
を削除します。このクラスを使用してルールが記述される既知のシナリオはないので、削除しても安全です。
これで問題が解決しない場合、生成されたRLにおけるトップレベルのXMLオブジェクトのファクト・クラス宣言を防止する必要があります。
この問題を解決するには、トップレベル・オブジェクトの「XPathアサーションのサポート」の選択を解除します。前述のエラー・メッセージの場合、これは「mypkgname.MyClassName」となります。
『Oracle Business Rulesユーザーズ・ガイド』の第C.3項では、サポートされているOracle以外のコンテナに対応するOracle以外の.earファイルのOracleAS Companion CD Diskにおける場所が誤って示されています。一部のプラットフォームでは、これらの.earファイルは記載されているOracleAS Companion CD DiskのDisk2ではなくDisk3にあります。
場合によって、次のRL生成エラーが発生することがあります。
「ファクト・クラスは事前に宣言する必要があります」
たとえば、データ・モデルで次の生成されたRLがあるとします。
ruleset DM { function CreateDataAndTestRules() { servOrders.ServiceOrderTypeImpl sot = new servOrders.ServiceOrderTypeImpl(); . . .
この場合は、Typeがファクト・クラス化される前に、実装されるImpl
クラスが自動的にファクト・クラス化されます。その後、Typeがルールにおいて参照されると、次のエラーがスローされます。
「ClassName: 構文エラーが見つかりました。エラー: ファクト・クラスは事前に宣言する必要がありますat line 5 column 3 in serviceDateValidation」
この問題を解決する方法を説明します。
それぞれがクラスを拡張してインタフェースを実装するような複雑な型の階層を持つクラスでは、特定の順序でクラスを参照する必要があります。クラスが正しい順序で参照されないと、ルール・エンジンはクラス階層を正しく判断できません。
この問題を解決するには、次の2つの方法があります。
ServiceOrderType
クラスの「supports XPath」をチェックします。この方法はパフォーマンス・コストがわずかにかかります。
CreateDataAndTestRules
関数内のコードを変更します。たとえば、インスタンスの作成を次のように変更します。
servOrders.ServiceOrderType sot = new servOrders.ServiceOrderTypeImpl();
これにより適切な順序で解析が行われ、実装クラスより前にスーパークラスが作成されます。