前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Drools规则引擎入门指南(二)

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

作者头像
Java学习录
发布2019-04-18 14:44:08
8590
发布2019-04-18 14:44:08
举报
文章被收录于专栏:Java学习录Java学习录

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

属性

首先我们在resources\rules文件夹下创建一个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"));    }

函数

接着我们在resources\rules文件夹下创建一个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,获取当前规则对象

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 属性
  • 函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档