本篇博客主要讲解Drools常用的属性以及函数
首先我们在resources\rules文件夹下创建一个Property.drl,还有一个DroolsApplicationPropertyTests
salience 属性的值默认为0,它的值越大执行的优先级就越高,看如下代码在执行的时候就会先执行salience2
123456789101112131415 | rule "salience2"salience 2 when eval(true) then System.err.println("salience2");endrule "salience1"salience 1 when eval(true) then System.err.println("salience1");end |
1234 | @Test public void testSalience() { kieSession.fireAllRules(); } |
当系统时间小于等于date-effective的值是才会执行。
12345678910111213 | rule "dateEffective"date-effective "2018-11-24" when then System.err.println("2018-11-24被执行");endrule "dateEffectiveTomorrow"date-effective "2018-11-25" when then System.err.println("2018-11-25被执行");end |
123456789 | @Testpublic void testDateEffective() { kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("dateEffective"));}@Testpublic void testDateEffectiveTomorrow() { kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("dateEffectiveTomorrow"));} |
由于今天是11月24,所以上方的dateEffectiveTomorrow将不会执行。
还有需要注意的是Drools默认的时间格式是dd-MMM-yyyy的,也就是说你必须使用24-十一月-2018它才能识别,我为什么能使用yyyy-MM-dd呢,请参考上篇文章中进行自动配置时的getKieServices()方法
4. enabled
当一个规则的enabled属性变为false时这条规则将不再可用
123456 | rule "enabled"enabled false when then System.err.println("被禁用的规则");end |
1234 | @Test public void testEnabled() { kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("enabled")); } |
接着我们在resources\rules文件夹下创建一个Function.drl,还有一个DroolsApplicationFunctionTests
Drools中常用函数分别为insert、update和retract,分别是插入更新和删除,我们来看一下下方的几个规则的执行过程
12345678910111213141516171819202122232425262728293031 | rule "test1" when then insert(new User("赵六",12)); System.err.println("创造赵六");endrule "test2" when $u:User(name=="赵六") then $u.setName("王五"); update($u); System.err.println("赵六");endrule "test3" when $u:User(name=="王五") then System.err.println("王五"); retract($u);endrule "test4" when $u:User(name=="王五") then System.err.println("王五删除删除之后"+$u.getName());end |
可用看的,test1规则没有判断条件,所以直接被执行,执行过程中它生成了一个对象插入到工作内存中,此对象的规则又恰好与test2规则匹配,所以紧接着test2执行,test2执行时更新了user对象,更新后的对象又匹配了test3,所以test3继续执行。执行完毕后user对象被删除,test4就执行不了了。
另外还有几个方法也是常用的:
- getWorkingMemory,获取当前的WorkingMemory对象
- halt,执行完当前规则后不再执行其他规则
- getRule,获取当前规则对象
本文所有源码:https://github.com/shiyujun/drools
本文出自http://zhixiang.org.cn/,转载请保留