流口水:简单规则在无状态会话中执行了两次



我创建了一个简单的流口水项目。一切正常,除了我的规则执行两次,而不是一次。

请检查我的规则:

package rules
rule "age and type match"
   when
       $droolsIntro : rules.DroolsInstruction( type == "Manager" ) && rules.DroolsInstruction( age >= 20 )
   then
       System.out.println("age and type match");
       System.out.println($droolsIntro.introduceYourself());
   end

请检查代码:

List<DroolsInstruction> facts = new ArrayList<DroolsInstruction>();
DroolsInstruction object3 = new DroolsInstruction("Manager", 25);
DroolsInstruction object4 = new DroolsInstruction("Policeman", 31);
facts.add(object3);
facts.add(object4);
DroolsDynamicJar drools = new DroolsDynamicJar();
StatelessKieSession kSession = drools.getStatelessSessionWithJar();
kSession.execute(facts);

这是输出,这表明该规则是针对同一对象执行两次的:

年龄和类型匹配经理,25,false

年龄和类型匹配经理,25,false

为什么?

此模式

DroolsInstruction( type == "Manager" )
DroolsInstruction( age >= 20 )

匹配一个实体"经理",而年龄> = 20,但对其关系没有任何约束。因此,25岁的经理与第一个模式和第二种模式相匹配:火!但是同一经理匹配第一个模式,一个旧警察匹配第二种模式:再次开火!

如果您想寻找老经理,最好写

DroolsInstruction( type == "Manager", age >= 20 )

尽管间接(不建议)

$di1: DroolsInstruction( type == "Manager" )                                            
$di2: DroolsInstruction( this == $di1, age >= 20 )

也可以工作。

最新更新