我正在插入数据到drools规则引擎,但我无法理解它如何处理插入的数据。插入数据的代码是:
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)
不要担心语法这是groovy文件。 规则是:
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的知识,请提供帮助。谢谢提前
答案 0 :(得分:4)
这是生产规则系统的一个非常基本的特征:详尽搜索由规则模式定义的所有可能组合。
Categories() // <= match with any object of class Categories
Test() // <= match with any object of class Test
您已插入4个,因此规则将针对每个可能的配对启动。
答案 1 :(得分: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
个getter。此外,以这种方式关联将减少规则匹配排列的数量)。如果它们以相同的方式匹配,您可能不需要收回事实。