1

過去 1 日間、問題を解決しようとしましたが、解決できませんでした。

プレイ モデルからよだれ (ルール) をトリガーしています。私のローカル環境では問題なく動作しています。

しかし、solaris ボックスの本番環境で同じアプリケーションをデプロイすると、次のエラーが発生します。

Error = Unable to resolve ObjectType 'Tracker' : [Rule name='PM APPROVAL']
Unable to resolve ObjectType 'User' : [Rule name='SEND MAILS']
Unable to resolve ObjectType 'Tracker' : [Rule name='SEND MAILS']
Error importing : 'models.Tracker'Error importing : 'notifications.TrackerMails'Error importing : 'models.User'Rule Compilation error : [Rule name='SEND MAILS']
    drools/Rule_SEND_MAILS_0.java (2:23) : Only a type can be imported. notifications.TrackerMails resolves to a package
    drools/Rule_SEND_MAILS_0.java (2:57) : Only a type can be imported. models.Tracker resolves to a package
    drools/Rule_SEND_MAILS_0.java (2:95) : Only a type can be imported. models.User resolves to a package
    drools/Rule_SEND_MAILS_0.java (8:422) : TrackerMails cannot be resolved
    drools/Rule_SEND_MAILS_0.java (8:455) : $user cannot be resolved to a variable
    drools/Rule_SEND_MAILS_0.java (8:461) : $tracker cannot be resolved to a variable

drooolssession を取得するサンプル コード。いくつかのフォーラムを調べて変数 classLoader を追加しましたが、まだ問題を修正していません。

StatefulKnowledgeSession dsession = null;           
            ClassLoader classLoader = TrackerUtil.class.getClassLoader();

            KnowledgeBuilderConfiguration kBuilderConfiguration = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null, classLoader);
            KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(kBuilderConfiguration);
            KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(null, classLoader);
            '''''

            builder.add(ResourceFactory.newFileResource(new File(uri)),ResourceType.DRL);

            ''''
            builder.add(ResourceFactory.newFileResource(new File(uri)),ResourceType.DRF);
            .......             

            KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConfig);
            knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());

            dsession = knowledgeBase.newStatefulKnowledgeSession();
            return dsession;

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

最後に、2日間の努力の後、問題を解決しました!!

Droolsがプレイモデルを解決できないため、問題が発生します.Eclipseでは、クラスパスにEclipse/クラスを追加するため、正常に動作します.しかし、「Play run」を実行するたびに、droolsはplay.modelsを見つけることができません.Soこれを克服するには、「tmp/classes」をクラスパスに追加する必要があります。

追加方法は次のとおりです

  1. play インストール ディレクトリに移動し、フォルダ内に移動 >> フレームワーク >> pym >> play
  2. application.py を開く
  3. メソッド def getClasspath(self) に移動します。
  4. メソッドで行classpath.append(os.path.normpath(os.path.join(self.path, 'conf')))を見つけ、その行の下に次の行を追加します

    classpath.append(os.path.normpath(os.path.join(os.path.join(self.path, 'tmp'),'classes')))

  5. これで、drools はプレイ モデルを見つけることができるようになります。

解決策2は

以下のようにプレイサーバーを呼び出すことができます

java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Dplay.debug=yes -Dplay.id= -Dapplication.path=/home/przemek/pn -Djava.endorsed.dirs=/opt/play/framework/endorsed -javaagent:/opt/play/framework/play-1.2.4.jar -Dfile.encoding=UTF-8 -classpath "Play computed classpath" and path to tmp classes  Play.server.Server

上記でも問題なく動作します。コマンド play classpath を実行すると、play で計算されたクラスパスを取得できます。Linux のクラスパスの区切り文字は「:」ですが、Windows では「;」です。

上記の解決策は機能しますが、理由の部分が本当にわかりませんでしたか? drools では同じモデルを解決できないのに、play ではどのようにモデルを解決できるのでしょうか?

上記の答えがわかる方教えてください。

于 2011-12-08T06:03:37.257 に答える