2012-05-09 11 views
1

私は、1回限りの使用のためにルールを動的に作成する必要があるユースケースを持っています。ルールは動的であり、最悪の場合、反復/要求ごとに異なる場合があります。したがって、私はそれらを保存することはできません。Drools - KnowlegeBuilderをより速く作成しますか?

Droolsについての私の理解は、KnowledgeBuilderを作成してからルールを追加する必要があるということです。

次のようにKnowledgeBaseを作成しています。

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

タイミングログに基づいて、コードはこれらの2つの操作で大部分(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がします。 DRL);

内部APIを使用しない限り、実際には使用するのが非常に複雑です。

記述子ビルダーAPIを使用して標準モデルを生成する中間ステップがあります。それはあなたに数サイクルを節約しますが、最も重い操作はJavaのコンパイルではありません。 DescrビルダーAPIの使用例:

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

関連する問題