2014-01-03 2 views
1

Я вставляю данные в механизм управления слюнами, но я не могу понять, как он обрабатывал вставленные данные. Код для вставки данных:Drools rule engine flow

final StatefulKnowledgeSession session = getSession() 
     new Thread() { 
        @Override public void run() { 
         Thread.currentThread().setName("RuleEngineThread") 
         println 'engine starting fire'+Thread.currentThread().getName() 
         session.fireUntilHalt(); 
        } 
       }.start(); 
     WorkingMemoryEntryPoint entrypoint=session.getWorkingMemoryEntryPoint("Multiple Stream") 
     entrypoint.insert(new Categories([categoryid:120,name:"catN1"])) 
     entrypoint.insert(new Test(100,120)) 

     entrypoint.insert(new Categories([categoryid:121,name:"catN2"])) 
     entrypoint.insert(new Test(100,121)) 
     entrypoint.insert(new Categories([categoryid:1220,name:"catN3"])) 
     entrypoint.insert(new Test(100,1220)) 
     entrypoint.insert(new Categories([categoryid:1202,name:"catN4"])) 
     entrypoint.insert(new Test(100,1202)) 
     println "Thread sleeeping for 3 secs" 
     Thread.currentThread().sleep(3000) 

не беспокойтесь о синтаксисе, это отличный файл. И правило существо:

rule "multiple-opt" 
    //duration 120 
    no-loop true 
when 
$c: Categories() from entry-point "Multiple Stream" 
$t: Test() from entry-point "Multiple Stream" 
then 
System.out.println("@@Multiple "+$c.getName()+":"+$t.getPrice()); 
end 

Выход я получаю довольно странно, так что я думаю, что я меньше понимания Drools выполнения. Выход:

engine starting fireRuleEngineThread 
Thread sleeeping for 3 secs 
@@Multiple catN1:100 
@@Multiple catN4:100 
@@Multiple catN3:100 
@@Multiple catN2:100 
@@Multiple catN1:100 
@@Multiple catN4:100 
@@Multiple catN3:100 
@@Multiple catN2:100 
@@Multiple catN1:100 
@@Multiple catN3:100 
@@Multiple catN2:100 
@@Multiple catN1:100 
@@Multiple catN2:100 

Я не могу понять, как правило, было уволено так много раз, в то время как я вставленные объекты меньше раз, чем количество выходов, которые я получаю.
Пожалуйста, помогите, если я не знаю некоторые сведения о drools.Thanks заранее

ответ

4

Это очень простая особенность систем управления производством: исчерпывающий поиск всех возможных комбинаций, определенных шаблонами правила.

Categories() // <= match with any object of class Categories 
Test()   // <= match with any object of class Test 

Вы вставили по 4 штуки, поэтому правило будет срабатывать для каждого возможного спаривания.

1

Просто чтобы добавить к @laune, в зависимости от вашего сценария, вы можете, например. убирается каждую пару фактов после матча:

then 
System.out.println("@@Multiple "+$c.getName()+":"+$t.getPrice()); 
retract($c); 
retract($t); 

Редактировать

Да, для того, чтобы коррелировать пары, вы можете использовать binding variable и затем процеживают на этом в шаблоне сопоставляются:

when 
$c: Categories($catid : categoryid) from entry-point "Multiple Stream" 
$t: Test(categoryid == $catid) from entry-point "Multiple Stream" 
then 
System.out.println("@@Multiple "+$c.getName()+":"+$t.getPrice()); 

(Предполагая, что есть геттер getCategoryId() по классу Test.Кроме того, корреляция таким образом уменьшит количество перестановок соответствия правилам). Возможно, вам не нужно будет убирать факты, если они сопоставлены в коррелированных парах таким образом.

+0

Если да, то должны быть дополнительные ограничения (categoryid?), Чтобы гарантировать, что правильные пары будут сопоставлены и убраны. – laune

Смежные вопросы