为啥缓存的 Drools KIE 基础仍然需要源 .drl 文件?

Posted

技术标签:

【中文标题】为啥缓存的 Drools KIE 基础仍然需要源 .drl 文件?【英文标题】:Why cached Drools KIE bases still require source .drl files?为什么缓存的 Drools KIE 基础仍然需要源 .drl 文件? 【发布时间】:2015-10-12 13:15:42 【问题描述】:

谁能解释一下,为什么 Drools 引擎仍然需要源 .drl 文件,即使已经使用 kie-maven-plugin 创建和部署了缓存的预编译 KIE 库?是否可以仅使用预编译的缓存文件? 我们正在使用 Drools 6.2.0.Final 和 kie-maven-plugin 来创建预编译的 KIE 库。生成的 .jar 文件包含每个 KIE 基础和相应的 .drl 源文件的二进制 kbase.cache 文件。如果我们尝试从生成的 .jar 中删除源 .drl 文件,KIE 基础加载会失败。 我们的 KIE 基地有 6000 多条规则。这就是加载所有 KIE 碱基的时间很重要的原因。在 "kieContainer.getKieBase("kie base name")" 调用期间,Drools 引擎花费相当多的时间来加载缓存的 KIE 库和源 .drl 文件。这就是为什么删除 .drl 文件可以让我们更快地加载 KIE 库。为什么我们仍然需要保留源 .drl 文件?谢谢。

【问题讨论】:

【参考方案1】:

我收到了 KIE 开发团队负责人的答复: “缓存用于 .class 编译。它仍然需要 DRL 来构建规则并连接预编译的 .class 文件。这样做是因为通常解析器和规则构建器不会太密集,但 .class 生成是。” https://groups.google.com/forum/#!topic/drools-usage/XqzfBvpdjSg 谢谢。

【讨论】:

【参考方案2】:

一个简单的方法是编译 DRL 文件,序列化生成的 KieBase 将文件放在任何你想要的地方。然后,只需反序列化并创建会话,然后就可以开始了。

第一部分:

KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();

/*** repeat
FileInputStream fis = new FileInputStream( "simple/simple.drl" );
kfs.write( "src/main/resources/simple.drl",
           kieServices.getResources().newInputStreamResource( fis ) );
/** until exhausted **/

KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) )
    System.out.println( results.getMessages() );
    throw new IllegalStateException( "### errors ###" );


KieContainer kieContainer =
    kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();

FileOutputStream fos = new FileOutputStream( BASEPATH );
ObjectOutputStream oos = new ObjectOutputStream( fos );
oos.writeObject( kieBase );
oos.close();

第二部分:

FileInputStream fis = new FileInputStream( BASEPATH );
ObjectInputStream ois = new ObjectInputStream( fis );
KieBase kieBase = (KieBase)ois.readObject();
kieSession = kieBase1.newKieSession();

【讨论】:

谢谢。但这不是我所要求的。我们之前做过类似的事情,当时 Drools 引擎没有 kie-maven-plugin。我们有多个带有drools的maven模块,在maven编译/打包阶段查看所有编译错误是一个很棒的功能。但是如果技术建议更清晰的方法,我们愿意使用它。我的问题是,如果我们使用标准 Drools 工具,为什么我们仍然需要在 jar 中包含预编译 KIE 库的 .drl 文件?还有一件事 - 现在我们使用 kmodule.xml 文件的配置方法,而不是直接加载 .drl 文件。 也许有人会告诉你这个功能还没有实现,你应该随时提交拉取请求。此外,我发现使用 API 来获得我想要的东西比尝试在一堆无文件中摸索更容易。您可以从 sn-p "Part One" 中获取所有错误。 “也许有人会告诉你这个功能还没有实现,你应该随时提交一个拉取请求”——这对我来说是一个可以接受的答案,如果它是一个Drools DEV 团队的官方回答。在这种情况下,我们将尝试创建一个合适的解决方法。但是我在官方消息来源中没有看到类似的东西,这就是为什么我认为它应该在盒子里工作。谢谢。 如果今天 Ambrose Bierce 会写他的“字典”,我相信他会添加一个条目 Documentation 稍后写的东西,永远不会读。 @laune 使用缓存的 KieBase 实例,触发AllRules 比直接使用实例需要更多时间。知道为什么会这样吗?问题在这里描述:***.com/questions/60200522/…

以上是关于为啥缓存的 Drools KIE 基础仍然需要源 .drl 文件?的主要内容,如果未能解决你的问题,请参考以下文章

java规则引擎drools6.5.0中kie的概论

直接从存储库加载 Drools/KIE Workbench 工件

Drools文档(十四)集成Spring

drools7 (FactHandle 介绍)

jboss规则引擎KIE Drools 6.3.0-高级讲授篇

Drools入门demo