Drools入门之规则then
update(Fact事实对象):它会告诉引擎一个对象已经改变了(一个绑定到LHS部分上的引用,即p),修改成功后在工作内存中会发生变化,可能会导致规则再次被激活。在经典的Hello World章节中有例子说明。只有真正将工作内存中的值改变时,其他规则体才能正常对变化后的Fact事实对象进行判断操作。
insert(new Object()):将一个新的Fact事实对象放入工作内存中。它不仅可以操作引用的Fact事实对象,还可以操作declare声明的Fact事实对象。这一点在declare声明章节有过说明。
insertLogical(new Object()):与insert类似,但是当没有更多的事实来支持当前触发规则的LHS部分时,该Fact事实对象将被自动删除。使用的并不是很多。delete(handle):从工作内存中删除一个Fact事实对象,其语法与update相似,都是通过引用LHS部分上绑定的值。
Update是修改Fact事实对象的一种方式,Drools还提供了另一种方式,即modfiy,modfiy的功能与update是一样的,但写法却有很大的不同。
modfiy的语言扩展为事实更新提供了结构化的方法,它将更新操作与多个设置器调用相结合,以更改对象的字段,其代码结构为:
modify ( <fact-expression> ) {
<expression> [ , <expression> ]*
}
括号的<fact-expression>
必须产生一个事实对象引用。{}中的表达式列表应该由给定对象的setter调用组成,不需要通常的对象引用来编写,这是由编译器自动添加的,下面通过一个例子来具体说明。
rule "modify rule"
when
$p:Person(age == 30)
then
modify($p){
setAge(32),
setDous(20),
setName("李飞飞")
}
System.out.println("modify 修改:"+$p);
end
通过上述例子可以看出,modify与update是不一样的,update必须先对Fact事实对象的引用值进行setter操作,再执行update命名。而modify需要在参数中先对Fact事实对象进行引用,在块中进行setter调用。
Drools为RHS部分提供了几个操作命名,下面分别进行介绍。
drools.halt()
:立即终止规则执行。只要有一条规则执行了drools.halt()
,则其他规则将不再进行判断,直接返回结束。这也是常用的一种手段。
drools.getWorkingMemory()
:返回WorkingMemory对象。
drools.setFocus(String s)
:将焦点放在指定的议程组上。
drools.getRule().getName()
:返回规则的名称。
drools.getTuple()
:返回与当前正在执行的规则匹配的数组,并且为drools.getActivation()
提供相应的激活(这些调用对于日志记录和调试很有用)。