为什么缓存的Drools KIE基仍然需要源.drl文件



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

我已经收到了KIE开发团队领导的答案:缓存用于.class编译。它仍然需要DRL来构建规则并连接预编译的.class文件。一般来说,解析器和规则构建器不是太密集,但.class生成是。"https://groups.google.com/forum/!主题/drools-usage/XqzfBvpdjSg谢谢你。

一个简单的方法是编译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();

最新更新