2012-05-09 38 views
1

我有一個用例,我需要爲一次性使用動態地創建一個規則。規則是動態的,在更糟糕的情況下,每個迭代/請求可能會有所不同。因此,我無法儲存它們。Drools - 更快地創建KnowlegeBuilder?

我目前對Drools的理解是,您需要創建一個KnowledgeBuilder,然後添加規則。

我按如下方式創建知識庫。

private KnowledgeBase readKnowledgeBase() throws Exception { 
long t1 = System.currentTimeMillis(); 
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
long t11 = System.currentTimeMillis(); 


    kbuilder.add(org.drools.io.ResourceFactory.newByteArrayResource(getRule()), ResourceType.DRL); 

long t2 = System.currentTimeMillis(); 

    KnowledgeBuilderErrors errors = kbuilder.getErrors(); 
    if (errors.size() > 0) { 
     for (KnowledgeBuilderError error: errors) { 
      System.err.println(error); 
     } 
     throw new IllegalArgumentException("Could not parse knowledge."); 
    } 
long t3 = System.currentTimeMillis(); 

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 
long t4 = System.currentTimeMillis(); 

    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
long t5 = System.currentTimeMillis(); 


    Collection<KnowledgePackage> kpackages = kbase.getKnowledgePackages(); 
      for (KnowledgePackage knowledgePackage : kpackages) { 
        System.out.println("Package -------- " + knowledgePackage.getName()); 
        Collection<Rule> rules = knowledgePackage.getRules(); 
        for (Rule rule : rules) { 
          System.out.println("****" + rule.getName()); 
        } 
      } 
long t6 = System.currentTimeMillis(); 

System.out.println((t11-t1) + " " + (t2-t11) + " " + (t3-t2) + " " + (t4-t3) + " " + (t5-t4) + " " + (t6-t5)+ " "); 

    return kbase; 
} 

基於定時登錄只有這兩個操作的時間的代碼取大多數(超過80%)。有沒有辦法讓它更快?或者有沒有辦法實現我的用例?

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
kbuilder.add(org.drools.io.ResourceFactory.newByteArrayResource(getRule()), ResourceType.DRL); 
+0

有關於這對Drools的用戶forum.http一些討論://drools.46999.n3.nabble.com/Is-there-a-這樣做,這個功能於Drools的-td3973888.html更快的方式 - 的 - –

回答

0

以下調用實際上將編譯代碼,也就是說,它會調用JDT Java編譯器:

kbuilder.add(org.drools.io.ResourceFactory.newByteArrayResource(getRule())的ResourceType。博士升);

除非使用內部API,否則無法避免這種情況,實際上使用起來非常複雜。

有一箇中間步驟是使用描述符構建器API生成規範模型。它會爲你節省幾個週期,但最重要的操作是java編譯。使用DESCR生成器API的例子:

https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test/java/org/drools/lang/api/DescrBuilderTest.java