Drools:在无状态会话中执行两次的简单规则
Drools: simple rule executed twice in a stateless session
我创建了一个简单的 Drools 项目。
一切正常,除了我的规则执行了两次,而不是一次。
请查看我的规则:
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);
这里是输出,显示规则对同一个对象执行了两次:
age and type match
Manager, 25, false
age and type match
Manager, 25, false
为什么?
这个模式
DroolsInstruction( type == "Manager" )
DroolsInstruction( age >= 20 )
匹配实体 "Manager" 和其中一个年龄 >= 20,但不对它们的关系做出任何限制。因此,一位 25 岁的经理符合第一个模式和第二个模式:开火!但是同一个经理匹配第一个模式,一个老警察匹配第二个模式:再开火!
想找老经理最好写
DroolsInstruction( type == "Manager", age >= 20 )
虽然是间接的(不推荐)
$di1: DroolsInstruction( type == "Manager" )
$di2: DroolsInstruction( this == $di1, age >= 20 )
也可以。
我创建了一个简单的 Drools 项目。 一切正常,除了我的规则执行了两次,而不是一次。
请查看我的规则:
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);
这里是输出,显示规则对同一个对象执行了两次:
age and type match Manager, 25, false
age and type match Manager, 25, false
为什么?
这个模式
DroolsInstruction( type == "Manager" )
DroolsInstruction( age >= 20 )
匹配实体 "Manager" 和其中一个年龄 >= 20,但不对它们的关系做出任何限制。因此,一位 25 岁的经理符合第一个模式和第二个模式:开火!但是同一个经理匹配第一个模式,一个老警察匹配第二个模式:再开火!
想找老经理最好写
DroolsInstruction( type == "Manager", age >= 20 )
虽然是间接的(不推荐)
$di1: DroolsInstruction( type == "Manager" )
$di2: DroolsInstruction( this == $di1, age >= 20 )
也可以。