Drools的一些属性

Drools中提供的属性如下表(部分属性):

接下来分别写一些demo介绍下这些属性的使用。

salience属性

salience属性用于指定规则的执行优先级,取值类型为Integer。数值越大越优先执行。每个规则都有一个默认的执行顺序,如果不设置salience属性,规则体的执行顺序为由上到下。

看下这个demo:

package testsalience
​
rule "rule_1"salience 9wheneval(true)thenSystem.out.println("规则rule_1触发");
end
​
rule "rule_2"salience 10wheneval(true)thenSystem.out.println("规则rule_2触发");
end
​
rule "rule_3"salience 8wheneval(true)thenSystem.out.println("规则rule_3触发");
end

通过控制台可以看到,规则文件执行的顺序是按照我们设置的salience值由大到小顺序执行的。建议在编写规则时使用salience属性明确指定执行优先级。

dialect属性

dialect属性用于指定当前规则使用的语言类型,取值为java和mvel,默认值为java。

注:mvel是一种基于java语法的表达式语言。mvel像正则表达式一样,有直接支持集合、数组和字符串匹配的操作符。mvel还提供了用来配置和构造字符串的模板语言。mvel表达式内容包括属性表达式,布尔表达式,方法调用,变量赋值,函数定义等。

enabled属性

enabled属性对应的取值为true和false,默认值为true。

用于指定当前规则是否启用,如果设置的值为false则当前规则无论是否匹配成功都不会触发。

rule "rule_comparison_notMemberOf" //指定当前规则不可用,当前规则无论是否匹配成功都不会执行 enabled false whenComparisonOperatorEntity(names not memberOf list)thenSystem.out.println("规则rule_comparison_notMemberOf触发");
end

no-loop属性

no-loop属性用于防止死循环,当规则通过update之类的函数修改了Fact对象时,可能使当前规则再次被激活从而导致死循环。取值类型为Boolean,默认值为false。

编写一个测试规则:

package testnoloop
import com.drools.entity.Student
/*此规则文件用于测试no-loop属性
*/
rule "rule_noloop"when// no-loop true$student:Student(age == 25)thenupdate($student);//注意此处执行update会导致当前规则重新被激活System.out.println("规则rule_noloop触发");
end

测试代码:

KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
​
Student student = new Student();
student.setAge(25);
​
//将数据提供给规则引擎,规则引擎会根据提供的数据进行规则匹配,如果规则匹配成功则执行规则
kieSession.insert(student);
​
kieSession.fireAllRules();
kieSession.dispose();

通过控制台可以看到,由于我们没有设置no-loop属性的值,所以发生了死循环。接下来设置no-loop的值为true再次测试则不会发生死循环。

activation-group属性

activation-group属性是指激活分组,取值为String类型。具有相同分组名称的规则只能有一个规则被触发。

编写一个测试规则:

package testactivationgroup
/*此规则文件用于测试activation-group属性
*/rule "rule_activationgroup_1"activation-group "mygroup"whenthenSystem.out.println("规则rule_activationgroup_1触发");
end
​
rule "rule_activationgroup_2"activation-group "mygroup"whenthenSystem.out.println("规则rule_activationgroup_2触发");
end

测试发现,上面的两个规则因为属于同一个分组,所以只有一个触发了。同一个分组中的多个规则如果都能够匹配成功,具体哪一个最终能够被触发可以通过salience属性确定。

agenda-group属性

agenda-group属性为议程分组,属于另一种可控的规则执行方式。用户可以通过设置agenda-group来控制规则的执行,只有获取焦点的组中的规则才会被触发。

编写测试文件:

package testagendagroup
/*此规则文件用于测试agenda-group属性
*/
rule "rule_agendagroup_1"agenda-group "myagendagroup_1"whenthenSystem.out.println("规则rule_agendagroup_1触发");
end
​
rule "rule_agendagroup_2"agenda-group "myagendagroup_1"whenthenSystem.out.println("规则rule_agendagroup_2触发");
end
//========================================================
rule "rule_agendagroup_3"agenda-group "myagendagroup_2"whenthenSystem.out.println("规则rule_agendagroup_3触发");
end
​
rule "rule_agendagroup_4"agenda-group "myagendagroup_2"whenthenSystem.out.println("规则rule_agendagroup_4触发");
end

测试代码:

KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
​
//设置焦点,对应agenda-group分组中的规则才可能被触发
kieSession.getAgenda().getAgendaGroup("myagendagroup_1").setFocus();
​
kieSession.fireAllRules();
kieSession.dispose();

通过控制台可以看到,只有获取焦点的分组中的规则才会触发。与activation-group不同的是,activation-group定义的分组中只能够有一个规则可以被触发,而agenda-group分组中的多个规则都可以被触发。

auto-focus属性

auto-focus属性为自动获取焦点,取值类型为Boolean,默认值为false。一般结合agenda-group属性使用,当一个议程分组未获取焦点时,可以设置auto-focus属性来控制。

编写测试文件:

package testagendagroup
​
rule "rule_agendagroup_1"agenda-group "myagendagroup_1"whenthenSystem.out.println("规则rule_agendagroup_1触发");
end
​
rule "rule_agendagroup_2"agenda-group "myagendagroup_1"whenthenSystem.out.println("规则rule_agendagroup_2触发");
end
//========================================================
rule "rule_agendagroup_3"agenda-group "myagendagroup_2"auto-focus true //自动获取焦点whenthenSystem.out.println("规则rule_agendagroup_3触发");
end
​
rule "rule_agendagroup_4"agenda-group "myagendagroup_2"auto-focus true //自动获取焦点whenthenSystem.out.println("规则rule_agendagroup_4触发");
end

测试:

KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
kieSession.fireAllRules();
kieSession.dispose();

运行规则发现,设置auto-focus属性为true的规则都触发了。

timer属性

timer属性可以通过定时器的方式指定规则执行的时间,使用方式有两种:

方式一:timer (int: <initial delay> <repeat interval>?)

此种方式遵循java.util.Timer对象的使用方式,第一个参数表示几秒后执行,第二个参数表示每隔几秒执行一次,第二个参数为可选。

方式二:timer(cron: <cron expression>)

此种方式使用标准的unix cron表达式的使用方式来定义规则执行的时间。

编写一个测试文件:

package testtimer
import java.text.SimpleDateFormat
import java.util.Date
/*此规则文件用于测试timer属性
*/
​
rule "rule_timer_1"timer (5s 2s) //含义:5秒后触发,然后每隔2秒触发一次whenthenSystem.out.println("规则rule_timer_1触发,触发时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
end
​
rule "rule_timer_2"timer (cron:0/1 * * * * ?) //含义:每隔1秒触发一次whenthenSystem.out.println("规则rule_timer_2触发,触发时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
end

测试:

KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
final KieSession kieSession = kieClasspathContainer.newKieSession();
​
new Thread(new Runnable() {public void run() {//启动规则引擎进行规则匹配,直到调用halt方法才结束规则引擎kieSession.fireUntilHalt();}
}).start();
​
Thread.sleep(10000);
//结束规则引擎
kieSession.halt();
kieSession.dispose();

注意:单元测试的代码和以前的有所不同,因为我们规则文件中使用到了timer进行定时执行,需要程序能够持续一段时间才能够看到定时器触发的效果。

date-effective属性

da      te-effective属性用于指定规则的生效时间,即只有当前系统时间大于等于设置的时间或者日期规则才有可能触发。默认日期格式为:dd-MMM-yyyy。用户也可以自定义日期格式。

编写测试文件:

package testdateeffective
/*此规则文件用于测试date-effective属性
*/
rule "rule_dateeffective_1"date-effective "2021-7-09 10:00"whenthenSystem.out.println("规则rule_dateeffective_1触发");
end

编写测试代码:

//设置日期格式
System.setProperty("drools.dateformat","yyyy-MM-dd HH:mm");
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
kieSession.fireAllRules();
kieSession.dispose();

注意:上面的代码需要设置日期格式,否则我们在规则文件中写的日期格式和默认的日期格式不匹配程序会报错。

date-expires属性

date-expires属性用于指定规则的失效时间,即只有当前系统时间小于设置的时间或者日期规则才有可能触发。默认日期格式为:dd-MMM-yyyy。用户也可以自定义日期格式。

编写测试文件:

package testdateexpires
/*此规则文件用于测试date-expires属性
*/
​
rule "rule_dateexpires_1"date-expires "2019-10-01 10:00"whenthenSystem.out.println("规则rule_dateexpires_1触发");
end

编写测试代码:

//设置日期格式
System.setProperty("drools.dateformat","yyyy-MM-dd HH:mm");
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
kieSession.fireAllRules();
kieSession.dispose();

上面就是一些常见的属性,具体使用上面也给出了demo,使用最多的应该就是分组属性和no-loop属性,当然其他的属性根据自己的项目也会有涉及到。

规则引擎Drools使用 第七篇 Drools 常见的属性相关推荐

  1. 规则引擎Drools使用 第四篇Drools基础语法

    前面介绍了Drools规则引擎,并讲解了一个编写drl文件的Demo,学习了Drools加载规则文件到规则引擎,注入Fact参数并触发规则的流程.本篇主要介绍Drool规则文件的构成,组成规则文件一些 ...

  2. 《Drools7.0.0.Final规则引擎教程》第1章 Drools简介

    1.1 什么是规则引擎 规则引擎是由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务 ...

  3. mysql 规则引擎_Drools规则引擎详解-常用的drl实例

    package droolsDemo //说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致, //主要用于可以根据kmodule.xml中不同的 ...

  4. drools规则引擎的基本使用和原理介绍

    理论基石 借用:<drools规则引擎技术指南>来说, drools是: 开源项目,规则引擎技术,规则语法形成的规则文件,可以存在数据库等,通过drools包提供的接口,调用生成对应的结果 ...

  5. 常见的规则引擎(Drools,RuleBook,Easy Rules等)对比

    参考文章: https://www.jianshu.com/p/96cd60059aae 规则引擎调研 - 人在江湖之诗和远方 - 博客园 java开源规则引擎比较_常用规则引擎比较分析_学校砍了我的 ...

  6. 【转】什么是规则引擎(Drools、OpenL Tablets、Easy Rules、RuleBook)

    什么是规则引擎(Drools.OpenL Tablets.Easy Rules.RuleBook) 发表于:2021年1月23日 分类:Drools, 规则引擎 标签:Drools, Easy-Rul ...

  7. 规则引擎Drools在贷后催收业务中的应用

    作者:vivo 互联网服务器团队- Feng Xiang 在日常业务开发工作中我们经常会遇到一些根据业务规则做决策的场景.为了让开发人员从大量的规则代码的开发维护中释放出来,把规则的维护和生成交由业务 ...

  8. 详解:Drools规则引擎探究

    引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...

  9. drools规则引擎 java_Drools规则引擎的使用总结

    前一段时间在开发了一个做文本分析的项目.在项目技术选型的过程中,尝试使用了Drools规则引擎.让它来作为项目中有关模式分析和关键词匹配的任务.但后来,因为某种原因,还是撇开了Drools.现将这个过 ...

最新文章

  1. 关于打开新链接,用当前页还是用新页面?
  2. adf的主要功能之一是_浅析高性能纤维纸基功能材料
  3. 邀请别人进入队伍rust_林俊杰组建DOTA2队伍,原Newbee五人被终身禁赛
  4. Visual Studio 中粗略的代码行数统计
  5. ElementUI的组件拆解之Tooltip
  6. 大学计算机基础知识点图文,大学计算机基础知识点超详细总结
  7. 基本控件Password控件
  8. 如何有效提高你的沟通技巧
  9. Linux 匿名页的反向映射
  10. 组装复杂json请求数据和解析复杂json数据
  11. 51nod1380 夹克老爷的逢三抽一
  12. 排序算法专题-希尔排序
  13. 3701汉化包 axure r9_Axure RP 9.0.0.3701 for Mac 中文共享版 – 知名的产品原型设计软件...
  14. representation learning的理解
  15. C语言常见缩写和英文
  16. 厦理Java期末训练题【附带每题答案,非标准但可通过PTA】
  17. 矩阵的主元+秩+矩阵等价
  18. 2018~2019学年第一学期期末考试试卷(A)卷《C语言程序设计》
  19. 普通程序员的出路是什么?
  20. matlab求解最优化问题(数学建模)

热门文章

  1. 机器人上单神装_LOL英雄联盟神级机器人(上单藐视一切)
  2. c语言程序设计书孙改平,孙改平
  3. 105、基于51单片机的智能电子密码锁红外遥控控制系统设计
  4. 大学是天堂? 当代大学生成绩分析
  5. php解析html dom节点树
  6. java数独游戏_java 数独sudoku游戏
  7. Web前端系列技术之移动Web开发(从基础开始)①
  8. 北、上、深交易所分别发布北交所上市公司转板办法,北交所上市公司87家
  9. autojs登号辅助脚本
  10. 进口代收业务和出口跟单托收