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

person Soumya Simanta    schedule 09.05.2012    source источник
comment
Об этом есть обсуждение на форуме пользователей Drools.пускает слюни.46999.n3.nabble.com/   -  person Soumya Simanta    schedule 10.05.2012


Ответы (1)


Следующий вызов фактически скомпилирует ваш код, т. е. вызовет компилятор JDT java:

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

Этого невозможно избежать, если только вы не используете внутренние API, которые на самом деле очень сложны в использовании.

Существует промежуточный шаг, который заключается в создании канонической модели с использованием API построителя дескрипторов. Это сэкономит вам несколько циклов, но не так много, так как самой тяжелой операцией является компиляция java. Примеры использования Descr Builder API:

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

person Edson Tirelli    schedule 10.05.2012