我遇到动态重新加载规则的问题。当我删除然后向KnowledgeBase添加相同的规则时,我在yourkit中看到,由Java编写的类的数量非常快。它看起来像添加一个规则导致重新创建permgen中的所有规则
首先我要删除我的规则:
existingKb.removeRule(pro.pkg, pro.name);
然后我添加新的版本:
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newReaderResource(new StringReader(rule)), ResourceType.DRL);
existingKb.addKnowledgePackages(kbuilder.getKnowledgePackages());
创建新类实例的方法wire在调用方法时调用每个规则:
kb.addKnowledgePackages
你知道这个问题吗?怎么解决这个?我正在使用java 7和drools 5.6 final。
解决方案
经过几次试验,我设法解决了这个问题。我改变了将现有知识库复制到新版本的方式:
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(existingKb);
KnowledgeBase newKb= KnowledgeBaseFactory.newKnowledgeBase();
kbuilder.add(ResourceFactory.newReaderResource(new StringReader(rule)), ResourceType.DRL);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
copyKnowledgePackagesIfNotExist(existingKb, newKb);
existingKb= newKb;
private void copyKnowledgePackagesIfNotExist(KnowledgeBase oldKb, KnowledgeBase newKb) {
for (KnowledgePackage oldKnowledgePackage : oldKb.getKnowledgePackages()) {
KnowledgePackage newKnowledgePackage = newKb.getKnowledgePackage(oldKnowledgePackage.getName());
if (newKnowledgePackage == null) {
Collection<KnowledgePackage> knowledgePackageCollection = new ArrayList<>();
knowledgePackageCollection.add(oldKnowledgePackage);
newKb.addKnowledgePackages(knowledgePackageCollection);
}
}
}
Drools仍然在Permgen中创建新类,但它们是垃圾收集。