Drools 如何删除有错误的规则
我有一个动态创建的规则列表。创建后,我立即检查是否有任何错误。但是我找不到一种方法来动态删除那些有错误的规则Drools 如何删除有错误的规则,drools,Drools,我有一个动态创建的规则列表。创建后,我立即检查是否有任何错误。但是我找不到一种方法来动态删除那些有错误的规则 public void validateRule(List<String> rules, Collection<AbstractFact> facts) { KieServices kieServices = KieServices.Factory.get(); KieFileSystem kieFileSystem = kie
public void validateRule(List<String> rules, Collection<AbstractFact> facts) {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
int ruleIndex = 0;
for (String rule : rules) {
StringBuilder ruleName = new StringBuilder("src/main/resources/rule");
ruleName.append(ruleIndex).append(".drl");
kieFileSystem.write(ruleName.toString(), rule);
ruleIndex ++;
}
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll();
if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {
//Remove rules which are failing
}
KieContainer container = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieSession ksession = container.newKieSession();
for (AbstractFact fact : facts) { // Insert All the facts
ksession.insert(fact);
}
ksession.fireAllRules();
}
将每个规则写入一个文件系统文件
try.drl
并调用buildAll。跟踪归档规则
删除try.drl
在第二个过程中,按现在的方式编写,跳过第一个过程中失败的规则。首先编译包,然后使用构建包加载知识包,从而解决了问题。这样,容器不会失败,只会忽略不正确的规则
public Collection<KiePackage> createAllPackages(List<String> rules) {
Collection<KiePackage> compiledPackages = new ArrayList<>();
int ruleIndex = 0;
for (String rule : rules) {
StringBuilder ruleName = new StringBuilder("src/main/resources/rule");
ruleName.append(ruleIndex).append(".drl");
kieFileSystem.write(ruleName.toString(), rule);
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll();
if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {
List<Message> messages = kieBuilder.getResults().getMessages(Message.Level.ERROR);
continue;
}
kieFileSystem.generateAndWritePomXML(kieServices.getRepository().getDefaultReleaseId());
KieContainer container = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kBase = container.getKieBase();
compiledPackages.addAll(kBase.getKiePackages());
ruleIndex ++;
}
return compiledPackages;
}
public void buildAllPackages(Collection<KiePackage> packages) {
KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
kieFileSystem.writeKModuleXML(kieModuleModel.toXML());
kieFileSystem.generateAndWritePomXML(kieServices.getRepository().getDefaultReleaseId());
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll();
KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KnowledgeBaseImpl kBase = (KnowledgeBaseImpl)kContainer.getKieBase();
Collection<KnowledgePackage> allPacksTrans = Collections2.transform(packages, new Function<KiePackage, KnowledgePackage>() {
@Override
public KnowledgePackage apply(KiePackage kiePackage) {
return (KnowledgePackage) kiePackage;
}
});
kBase.addKnowledgePackages(allPacksTrans);
}
公共集合createAllPackages(列表规则){
Collection compiledPackages=new ArrayList();
int ruleIndex=0;
for(字符串规则:规则){
StringBuilder ruleName=新的StringBuilder(“src/main/resources/rule”);
规则名.append(规则索引).append(“.drl”);
kieFileSystem.write(ruleName.toString(),rule);
KieBuilder KieBuilder=kieServices.newKieBuilder(kieFileSystem.buildAll();
if(kieBuilder.getResults().hasMessages(Message.Level.ERROR)){
List messages=kieBuilder.getResults().getMessages(Message.Level.ERROR);
继续;
}
kieFileSystem.generateAndWritePomXML(kieServices.getRepository().getDefaultReleaseId());
KieContainer=kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kBase=container.getKieBase();
compiledPackages.addAll(kBase.getKiePackages());
规则索引++;
}
返回已编译的包;
}
公共void buildAllPackages(集合包){
KieModuleModel KieModuleModel=kieServices.newKieModuleModel();
kieFileSystem.writeKModuleXML(kieModuleModel.toXML());
kieFileSystem.generateAndWritePomXML(kieServices.getRepository().getDefaultReleaseId());
KieBuilder KieBuilder=kieServices.newKieBuilder(kieFileSystem.buildAll();
KieContainer kContainer=kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KnowledgeBaseImpl kBase=(KnowledgeBaseImpl)kContainer.getKieBase();
Collection allPacksTrans=Collections2.transform(包,新函数(){
@凌驾
公共知识包申请(Kiepack Kiepack){
返回(知识包)文件包;
}
});
kBase.addKnowledgePackages(AllPackTrans);
}
buildAll()总是适合我。但当创建newKieContainer时,该规则失败。例如,规则的表达式不正确。(代码!=)你的评论让我无法理解。也许您将来自构建器的错误消息添加到您的问题中,或者您将得到什么作为异常,以及堆栈跟踪。
public Collection<KiePackage> createAllPackages(List<String> rules) {
Collection<KiePackage> compiledPackages = new ArrayList<>();
int ruleIndex = 0;
for (String rule : rules) {
StringBuilder ruleName = new StringBuilder("src/main/resources/rule");
ruleName.append(ruleIndex).append(".drl");
kieFileSystem.write(ruleName.toString(), rule);
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll();
if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {
List<Message> messages = kieBuilder.getResults().getMessages(Message.Level.ERROR);
continue;
}
kieFileSystem.generateAndWritePomXML(kieServices.getRepository().getDefaultReleaseId());
KieContainer container = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBase kBase = container.getKieBase();
compiledPackages.addAll(kBase.getKiePackages());
ruleIndex ++;
}
return compiledPackages;
}
public void buildAllPackages(Collection<KiePackage> packages) {
KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
kieFileSystem.writeKModuleXML(kieModuleModel.toXML());
kieFileSystem.generateAndWritePomXML(kieServices.getRepository().getDefaultReleaseId());
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll();
KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KnowledgeBaseImpl kBase = (KnowledgeBaseImpl)kContainer.getKieBase();
Collection<KnowledgePackage> allPacksTrans = Collections2.transform(packages, new Function<KiePackage, KnowledgePackage>() {
@Override
public KnowledgePackage apply(KiePackage kiePackage) {
return (KnowledgePackage) kiePackage;
}
});
kBase.addKnowledgePackages(allPacksTrans);
}