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

2019-04-18 14:44:08 浏览数 (2)

本篇博客主要讲解Drools常用的属性以及函数

属性

首先我们在resourcesrules文件夹下创建一个Property.drl,还有一个DroolsApplicationPropertyTests

1. salience优先级

salience 属性的值默认为0,它的值越大执行的优先级就越高,看如下代码在执行的时候就会先执行salience2

代码语言:javascript复制
 rule "salience2"salience 2    when        eval(true)    then        System.err.println("salience2");end
rule "salience1"salience 1    when        eval(true)    then        System.err.println("salience1");end
代码语言:javascript复制
@Test   public void testSalience() {       kieSession.fireAllRules();   }
2. date-effective日期比较(小于等于)

当系统时间小于等于date-effective的值是才会执行。

代码语言:javascript复制
rule "dateEffective"date-effective "2018-11-24"    when    then        System.err.println("2018-11-24被执行");end
rule "dateEffectiveTomorrow"date-effective "2018-11-25"    when    then        System.err.println("2018-11-25被执行");end
代码语言:javascript复制
@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()方法

3. date-expires日期比较(大于)

刚好于date–effective相反

4. enabled

当一个规则的enabled属性变为false时这条规则将不再可用

代码语言:javascript复制
rule "enabled"enabled false    when    then        System.err.println("被禁用的规则");end
代码语言:javascript复制
@Test    public void testEnabled() {        kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("enabled"));    }

函数

接着我们在resourcesrules文件夹下创建一个Function.drl,还有一个DroolsApplicationFunctionTests

Drools中常用函数分别为insert、update和retract,分别是插入更新和删除,我们来看一下下方的几个规则的执行过程

代码语言:javascript复制
rule "test1"    when
    then      insert(new User("赵六",12));      System.err.println("创造赵六");end
rule "test2"    when       $u:User(name=="赵六")    then        $u.setName("王五");        update($u);        System.err.println("赵六");end
rule "test3"    when         $u:User(name=="王五")    then        System.err.println("王五");        retract($u);end
rule "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,获取当前规则对象

0 人点赞