Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 外部DRL文件加载到多个KieBase实例中_Java_Xml_Drools - Fatal编程技术网

Java 外部DRL文件加载到多个KieBase实例中

Java 外部DRL文件加载到多个KieBase实例中,java,xml,drools,Java,Xml,Drools,注意:这都是使用Kie库的当前6.4.0.1最终实现。 你好。我尝试使用Drools的方式在网上找不到太多信息(或者我只是在搜索错误的东西,但我已经尝试了几天),所以我想在这里问一个关于我的用例的问题 我想创建多个KieBase实例,因为我假设这是我应该处理这个问题的“级别”,每个实例在构建时都有自己的一组隐藏的预先生成的规则,在的某个地方,而不是在resources文件夹中(此时是应用程序部署的根文件夹) 因此,如果我有同一个对象A、B或C的多个实例,它们都可以有不同的属性,因此每个对象都有不

注意:这都是使用Kie库的当前6.4.0.1最终实现。

你好。我尝试使用Drools的方式在网上找不到太多信息(或者我只是在搜索错误的东西,但我已经尝试了几天),所以我想在这里问一个关于我的用例的问题

我想创建多个KieBase实例,因为我假设这是我应该处理这个问题的“级别”,每个实例在构建时都有自己的一组隐藏的预先生成的规则,在的某个地方,而不是在resources文件夹中(此时是应用程序部署的根文件夹)

因此,如果我有同一个对象A、B或C的多个实例,它们都可以有不同的属性,因此每个对象都有不同的规则

我认为创建一个文件夹,在本例中是
/rules
,其中包含每个事件的子文件夹,这将是一个很好的方法。每当创建对象时,都会在此
/rules
文件夹中创建一个相对文件夹

  • 对象A的
    /rules/A/
  • 对象B的
    /rules/B/
  • 对象C的
    /rules/C/
然后通过其他方式,我在这些子文件夹中生成DRL文件,基本上——如果我错了,请纠正我——创建包

现在,当我开始为对象A添加子对象时,我只想对它们应用
/rules/A
文件夹中的规则

因此,我编写了以下加载类,以下是联机示例,我想加载一个KieBase实例,专门加载我添加到某个对象文件夹中的规则文件:

private KieBase loadKieBase(字符串标识符){
KieServices=KieServices.Factory.get();
KieFileSystem KieFileSystem=kieServices.newKieFileSystem();
List drlFiles=fileHandler.loadFiles(标识符);
用于(字符串drl:drl文件){
String path=“src/main/resources/drools/”+drl;
Resource=ResourceFactory.newFileResource(drl);
kieFileSystem.write(路径、资源);
}
KieBuilder KieBuilder=kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
Results=kieBuilder.getResults();
if(results.hasMessages(Message.Level.ERROR)){
...
}
KieContainer KieContainer=kieServices.newKieContainer(kieBuilder.getKieModule().getReleaseId());
KieBaseConfiguration KieBaseConfiguration=kieServices.newKieBaseConfiguration();
KieBase KieBase=kieContainer.newKieBase(kieBaseConfiguration);
返回基地;
}
日志向我显示资源被正确加载,这意味着
kieFileSystem.write(…)
行获得一个有效的资源参数。打印加载的文件也会为我请求文件的对象提供我想要查看的文件。所以那部分都起作用了。但是,我得到以下警告:

WARN o.d.c.k.b.impl.AbstractKieModule-找不到KieBase defaultKieBase的文件

似乎确实没有文件被写入我在参考资料中创建的
src/main/resources/drools/
文件夹。我甚至不认为这是必要的——它们不应该简单地载入内存吗?当我可以从预生成的文件位置加载它们时,为什么还要再次编写它们

这可能是因为我的
kmodule.xml
文件不正确(相反,如果我想在内存中基本上使用Kiebase,我甚至应该有一个吗?在我看来,将这个“物理”引用到您动态创建的知识包是没有意义的…)?这是供参考的文件:


也许这是正确的,我接下来遇到了另一个问题,可能与此有关

我生成的DRL文件使用以下模板作为文件的“头”:

package drools

import org.droolstest.TestTicket

global org.slf4j.Logger logger

rule "same-ticket"
    ...
end
之后,我尝试使用以下调用:

KieBase-KieBase=loadKieBase(eventToken);
KieSession KieSession=kieBase.newKieSession();
kieSession.setGlobal(“记录器”,记录器);
导致应用程序崩溃,出现以下异常:

INFO  o.d.c.k.b.impl.KieRepositoryImpl - KieModule was added: MemoryKieModule[releaseId=org.default:artifact:1.0.0-SNAPSHOT]
INFO  c.p.a.c.m.r.RuleGroupClusterModule - KieBase: org.drools.core.impl.KnowledgeBaseImpl@738b876e
INFO  c.p.a.c.m.r.RuleGroupClusterModule - KieSession: KieSession[0]
Exception in thread "Thread-4" java.lang.RuntimeException: Unexpected global [logger]
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.setGlobal(StatefulKnowledgeSessionImpl.java:1162)
这也让我困惑。我假设KieBase没有正确加载文件,或者类似的东西(这就是为什么我包含了这个问题的大量构建——对不起,只是我不知道问题的根源在哪里)

我发现很难理解这里可能存在的问题——除了
kmodule.xml
文件之外,一切似乎都很好,对吧?因此,任何形式的帮助都将不胜感激!:)

提前多谢


PS:我突然瞥了一眼类似的问题。这看起来非常相似,但我不想在resources文件夹中生成文件,这正是self-Response所要解决的问题。

我认为在配置kiebase(以编程方式)和kmodule.xml之间确实存在一些冲突。您是否尝试过在不使用kmodule.xml的情况下编译和运行?对我来说,最合理的解释是,xml中的kiebase具有优先权。我还认为这对您很有用:


您的最佳计划可能是将所有DRL文件包含在方法的加载和编译代码中
loadKieBase
。您得到的错误表明声明全局记录器的DRL未包含在该KieBase的构建中,因此请确保(通过显式调用写入KIE文件系统)确实包含在其中。谢谢您的评论。目前,我只有一个测试“子文件夹”和一个规则文件。我很确定它会被加载,并在对kieFileSystem.write()方法的调用中使用。我会错过编译组件或类似的东西吗?它似乎没有记录任何错误的地方,即使我已经所有的设置。你似乎也是这本书的作者,这似乎是我也尝试过的方法,所以r