1,drools内置方法
规则文件的RHS
部分的主要作用是通过插入,删除或修改工作内存中的Fact数据,来达到控制规则引擎执行的目的。Drools提供了一些方法可以用来操作工作内存中的数据,操作完成后规则引擎会重新进行相关规则的匹配,原来没有匹配成功的规则在我们修改数据完成后有可能就会匹配成功了。
创建实体类
package com.dream21th.drools.study.demo4; import lombok.*; import java.util.List; /* * @Author dream21th **/ @Data @ToString @Builder @NoArgsConstructor @AllArgsConstructor public class Student { private String name; private String result; private Integer age; private String sex; private List<String> subjects; } |
2,内置方法update
update方法的作用是更新工作内存中的数据,并让相关的规则重新匹配。
创建规则文件:
package rules; import com.dream21th.drools.study.demo4.Student; rule "demo4_update_1" when $s:Student( age==10) then $s.setAge(20); update($s) System.out.println("触发demo4_update_1:年龄等于"+$s.getAge()); end rule "demo4_update_2" when $s:Student(age==20) then $s.setAge(30); update($s) System.out.println("触发demo4_update_2:年龄等于"+$s.getAge()); end rule "demo4_update_3" when $s:Student(age==30) then $s.setAge(40); update($s) System.out.println("触发demo4_update_3:年龄等于"+$s.getAge()); end rule "demo4_update_4" when $s:Student(age==40) then $s.setAge(50); update($s) System.out.println("触发demo4_update_4:年龄等于"+$s.getAge()); end |
测试类
@Test public void test1(){ KieServices kieServices = KieServices.Factory.get(); KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer(); //会话对象,用于和规则引擎交互 KieSession kieSession = kieClasspathContainer.newKieSession(); Student student= Student.builder().age(10).build(); kieSession.insert(student); //激活规则引擎,如果规则匹配成功则执行规则(匹配规则名以demo4_update开始的) kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("demo4_update")); System.out.println(student); //关闭会话 kieSession.dispose(); } |
测试结果
触发demo4_update_1:年龄等于20 触发demo4_update_2:年龄等于30 触发demo4_update_3:年龄等于40 触发demo4_update_4:年龄等于50 Student(name=null, result=null, age=50, sex=null, subjects=null) |
通过控制台的输出可以看到规则文件中定义的三个规则都触发了。
在更新数据时需要注意防止发生死循环。
3,insert方法
insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配。
创建规则文件:
package rules; import com.dream21th.drools.study.demo4.Student; rule "demo4_insert_1" when $s:Student( age==10) then Student student=Student.builder().age(20).build(); insert(student); //往工作内存中插入一个对象 System.out.println("触发demo4_insert_1:年龄等于"+$s.getAge()); end rule "demo4_insert_2" when $s:Student(age==20) then $s.setAge(30); update($s) System.out.println("触发demo4_insert_2:年龄等于"+$s.getAge()); end rule "demo4_insert_3" when $s:Student(age==30) then $s.setAge(40); update($s) System.out.println("触发demo4_insert_3:年龄等于"+$s.getAge()); end rule "demo4_insert_4" when $s:Student(age==40) then $s.setAge(50); update($s) System.out.println("触发demo4_insert_4:年龄等于"+$s.getAge()); end |
创建测试类
@Test public void test2(){ KieServices kieServices = KieServices.Factory.get(); KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer(); //会话对象,用于和规则引擎交互 KieSession kieSession = kieClasspathContainer.newKieSession(); Student student= Student.builder().age(10).build(); kieSession.insert(student); //激活规则引擎,如果规则匹配成功则执行规则 kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("demo4_insert")); System.out.println(student); //关闭会话 kieSession.dispose(); } |
测试结果
触发demo4_insert_1:年龄等于10 触发demo4_insert_2:年龄等于30 触发demo4_insert_3:年龄等于40 触发demo4_insert_4:年龄等于50 Student(name=null, result=null, age=10, sex=null, subjects=null) |
通过控制台输出可以发现,四个规则都触发了,这是因为首先进行规则匹配时只有第一个规则可以匹配成功,但是在第一个规则中向工作内存中插入了一个数据导致重新进行规则匹配,此时第二个规则可以匹配成功。在第二个规则中进行了数据修改导致第三个规则也可以匹配成功,以此类推最终四个规则都匹配成功并执行了。
4,retract方法
retract方法的作用是删除工作内存中的数据,并让相关的规则重新匹配。
创建规则文件
package rules; import com.dream21th.drools.study.demo4.Student; rule "demo4_retract_1" when $s:Student( age==10) then retract($s) System.out.println("触发demo4_retract_1:年龄等于"+$s.getAge()); end rule "demo4_retract_2" when $s:Student(age==10) then $s.setAge(30); update($s) System.out.println("触发demo4_retract_2:年龄等于"+$s.getAge()); end rule "demo4_retract_3" when $s:Student(age==30) then $s.setAge(40); update($s) System.out.println("触发demo4_retract_3:年龄等于"+$s.getAge()); end rule "demo4_retract_4" when $s:Student(age==40) then $s.setAge(50); update($s) System.out.println("触发demo4_retract_4:年龄等于"+$s.getAge()); end |
创建测试类
@Test public void test3(){ KieServices kieServices = KieServices.Factory.get(); KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer(); //会话对象,用于和规则引擎交互 KieSession kieSession = kieClasspathContainer.newKieSession(); Student student= Student.builder().age(10).build(); kieSession.insert(student); //激活规则引擎,如果规则匹配成功则执行规则 kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("demo4_retract")); System.out.println(student); //关闭会话 kieSession.dispose(); } |
测试结果
触发demo4_retract_1:年龄等于10 Student(name=null, result=null, age=10, sex=null, subjects=null) |
只触发第一条规则,这是因为工作内存中的student对象被删去的缘故
代码地址: https://gitee.com/dream21th/drools-study/tree/master/demo4