2016-12-29 71 views
0

我沒有得到任何具體的方式使用Drools的6 我曾嘗試使用下面的示例代碼做到這一點做到這一點:這裏 `如何使用Drools 6導入Drools決策表目前在多張相同的Excel文件中?

private static KieBase readBase(String strFilePath) throws IOException, BiffException { 
     DecisionTableConfiguration dtconf = KnowledgeBuilderFactory.newDecisionTableConfiguration(); 
     dtconf.setInputType(DecisionTableInputType.XLS); 

     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
     File xls = new File(strFilePath); 

     SpreadsheetCompiler compiler = new SpreadsheetCompiler(); 
     Workbook w; 
     String sheetName = ""; 
     FileInputStream in = null; 

     try { 

      w = Workbook.getWorkbook(xls); 
      for (Sheet sheet : w.getSheets()) { 

       sheetName = sheet.getName(); 
       in = new FileInputStream(xls); 

       System.out.println("The sheet name is : " + sheetName); 

       compileSheet(kbuilder, xls, compiler, sheetName, in); 


      } 


     } catch (DecisionTableParseException e) { 
      System.out.println("Failed to parse spreadsheet " + sheetName + " " 
        + e); 
     } 

     KieBase k = KnowledgeBaseFactory.newKnowledgeBase(); 
//  kContainer. 
     KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase(); 
     kb.addKnowledgePackages(kbuilder.getKnowledgePackages()); 

     return kb; 
    } 

    private static KnowledgeBuilder compileSheet(KnowledgeBuilder kbuilder, File xls, SpreadsheetCompiler compiler, String sheetName, FileInputStream in) { 
     try { 
      String compiled = compiler.compile(in, sheetName); 

      kbuilder.add(ResourceFactory.newReaderResource(new StringReader(compiled)), ResourceType.DRL); 
      System.out.println("***************************************drl**************************************"); 
      System.out.println(compiled); 

     } catch (DecisionTableParseException dtpe) { 
      if (dtpe.getMessage().equals("No RuleTable's were found in spreadsheet.")) { 
       System.out.println("No rule tables found in sheet {}" + sheetName); 
      } else { 
       throw dtpe; 
      } 
     } 
     return kbuilder; 
    } 

`

問題是Drools的6使用KIEBase不是知識庫,所以我沒有找到適合在KieBase中加載編譯表的方法。在Drools 6中還有其他方法嗎?

回答

0
KieServices kieServices = KieServices.Factory.get(); 
KieFileSystem kfs = kieServices.newKieFileSystem(); 
FileInputStream fis = new FileInputStream("dir/some.drl"); 
kfs.write("src/main/resources/simple.drl", 
      kieServices.getResources().newInputStreamResource(fis)); 

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

你也可以在dsl,dslr和xls文件中使用它。