Drools规则引擎入门指南(二)

匿名 (未验证) 提交于 2019-12-02 23:03:14

本篇博客主要讲解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就执行不了了。

另外还有几个方法也是常用的:

  1. getWorkingMemory,获取当前的WorkingMemory对象
  2. halt,执行完当前规则后不再执行其他规则
  3. getRule,获取当前规则对象

本文所有源码:https://github.com/shiyujun/drools

本文出自http://zhixiang.org.cn/,转载请保留

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!