有人可以解释一下,为什么Drools引擎仍然需要源.drl文件,即使已经使用kie-maven-plugin创建并部署了缓存的预编译KIE库?是否可以仅使用预编译的缓存文件? 我们正在使用Drools 6.2.0.Final和kie-maven-plugin来创建预编译的KIE库。生成的.jar文件包含每个KIE基础的二进制kbase.cache文件和相应的.drl源文件。如果我们尝试从生成的.jar中删除源.drl文件,则KIE库加载失败。 我们的KIE基地有6000多条规则。这就是加载所有KIE碱基的时间非常重要的原因。在“kieContainer.getKieBase(”kie base name“)”调用期间,Drools引擎花费相当的时间来加载缓存的KIE库和源.drl文件。这就是为什么删除.drl文件将允许我们更快地加载KIE基础。为什么我们仍然需要保留源.drl文件?谢谢。
答案 0 :(得分:3)
我收到了KIE开发团队负责人的答复: “缓存用于.class编译。它仍然需要DRL来构建规则并连接预编译的.class文件。这是通过这种方式完成的,因为通常解析器和规则构建器不是太密集,但.class生成是“。 https://groups.google.com/forum/#!topic/drools-usage/XqzfBvpdjSg 谢谢。
答案 1 :(得分:1)
一种简单的方法是编译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();