Drools规则引擎流程

时间:2014-01-03 10:16:30

标签: java drools

我正在插入数据到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的知识,请提供帮助。谢谢提前

2 个答案:

答案 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。此外,以这种方式关联将减少规则匹配排列的数量)。如果它们以相同的方式匹配,您可能不需要收回事实。