在Drools当中,在RHS里面,提供了一些对当前Working Memory实现快速操作的宏宏函数或对象, 比如insert/insertLogical、 update和retract就可以实现对当前 Working Memory中的 Fact 对象进⾏新增、删除或者是修改
1 insert
函数insert的作用与我们在Java类当中调用StatefulKnowledgeSession对象的insert⽅法的作⽤相同,都是用来将⼀个Fact对象插⼊到当前的Working Memory当中
需注意:⼀旦调⽤ insert 宏函数,那么 Drools 会重新与所有的规则再重新匹配⼀次, 对于没有设置no-loop属性为 true 的规则,如果条件满⾜,不管其之前是否执⾏过都会再执⾏⼀次,这个特性不仅存在于 insert 宏函数上,后⾯介绍的 update、retract 宏函数同样具有该特性,所以在某些情况下因考虑不周调⽤ insert、update 或 retract 容易发生死循环
示例:
//Drools提供的内置⽅法insert
rule "rule5"
when
eval(true);
//默认成⽴
then
Customer cus=new Customer();
cus.setName("张三");
insert(cus);
System.out.println("测试Drools提供的内置⽅法insert 触发...");
end
rule "rule6"
when
$customer:Customer(name =="张三");
then
System.out.println("测试Drools提供的内置⽅法insert 触 发..."+$customer.getName());
end
测试:
@Test
public void test4() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
//会话对象,⽤于和规则引擎交互
KieSession kieSession = kieContainer.newKieSession();
//激活规则引擎,如果匹配成功则执⾏规则
kieSession.fireAllRules();
//关闭会话
kieSession.dispose();
}
执行结果如下:
insertLogical
insertLogical作用与insert类似,它的作⽤也是将⼀个Fact对象插⼊到当前的Working Memroy当中
2 update
update函数意义与其名称⼀样,⽤来实现对当前Working Memory当中的Fact进⾏更新,用来告诉当前的Working Memory该Fact对象已经发生了变化。
示例:
rule "rule7"
//no-loop true
when
$customer:Customer(name =="李四");
then
$customer.setName("张三");
update($customer);
System.out.println("测试Drools提供的内置⽅法update 触发...");
end
rule "rule8"
when
$customer:Customer(name =="张三");
then
System.out.println("测试Drools提供的内置⽅法update 触 发..."+$customer.getName());
end
测试:
@Test
public void test5() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
//会话对象,⽤于和规则引擎交互
KieSession kieSession = kieContainer.newKieSession();
Customer customer = new Customer();
customer.setName("李四");
kieSession.insert(customer);
//激活规则引擎,如果匹配成功则执⾏规则
kieSession.fireAllRules();
//关闭会话
kieSession.dispose();
}
执行结果如下:
3 retract
retract⽤来将Working Memory当中某个Fact对象从Working Memory当中删除
//Drools提供的内置⽅法retract
rule "rule9"
when
$customer:Customer(name =="李四");
then
retract($customer);
System.out.println("测试Drools提供的内置⽅法retract 触发...");
end
rule "rule10"
when
$customer:Customer();
then
System.out.println("测试Drools提供的内置⽅法retract 触 发..."+$customer.getName());
end
测试:
@Test
public void test6() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
//会话对象,⽤于和规则引擎交互
KieSession kieSession = kieContainer.newKieSession();
Customer customer = new Customer();
customer.setName("李四");
kieSession.insert(customer);
//激活规则引擎,如果匹配成功则执⾏规则
kieSession.fireAllRules();
//通过规则过滤器实现只执⾏指定规则
// kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule5"));
// 关闭会话
kieSession.dispose();
}
执行结果如下:
rule9已经删除了李四这条数据,所以rule10没有执行。
如果将retract注释掉再执行,结果如下:
规则没有执行retract,所以rule10规则生效。



