2017-04-14 55 views
0

我有一個動態創建的規則列表。立即創建後,我檢查是否有任何錯誤。但我找不到一種方法來動態地刪除那些有錯誤的規則。如何刪除有錯誤的規則

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

Drools的文件進行驗證

template header 

name 

package test; 


template "test template" 

rule "test rule" 

when 

    $fact : Fact(code !=) // expression is wrong intentionally 

then 
    $fact.setOk(false); 

end 

end template 

回答

0

寫每個規則的KieFileSystem文件try.drl並調用buildAll。跟蹤申請規則。

刪除try.drl。

在第二遍中,像現在這樣寫,跳過第一遍中失敗的規則。

+0

buildAll()總是適合我。但是,創建newKieContainer時規則失敗。例如,規則的表達是不正確的。 (code!=) – UserAdi

+0

您的評論對我來說無法理解。也許你會將構建器的錯誤消息添加到您的問題中,或者您將獲得什麼作爲異常以及堆棧跟蹤。 – laune

0

通過先編譯包然後使用構建包加載知識包來解決這些問題。這樣,KieContainer不會失敗,並且會忽略不正確的規則。

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