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);
    }