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

经过两天的努力,我终于解决了这个问题!

问题来了,因为 Drools 无法解析播放模型。在 eclipse 中,它可以正常工作,因为它将 eclipse/classes 添加到类路径中。但是每当你运行“播放运行”时,drools 都无法找到 play.models。所以为了克服这个问题,我们需要将“tmp/classes”添加到类路径中。

这是我们可以添加的方法

  1. Go to you play 安装目录 go inside folder >> framework >> pym >> play
  2. 打开应用程序.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. 现在流口水将能够找到游戏模型。一切看起来都很好。

解决方案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 来获得播放计算的类路径。对于类路径,Linux 中的分隔符是“:”,而在 Windows 中是“;”

上述解决方案有效但我真的不明白为什么部分? play 是如何解决模型的,而 drools 无法解决相同的模型?

如果你知道上面的答案,请告诉我。

于 2011-12-08T06:03:37.257 回答