目前市面上比较热门的规则引擎有几款:
- Ilog JRules 是最有名的商用BRMS;
- Drools 是最活跃的开源规则引擎;
- Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代表;
- Visual Rules(旗正规则引擎)国内商业规则引擎品牌。
本文将着重介绍Drools。
一 为什么要使用规则引擎
有如下案例,充值得积分的案例 ,规则如下:
传统java业务实现如下:
这时候由于市场需求变化,又要调整规则时候,则又要进行业务层面的代码修改、部署,十分麻烦。如果我们可以把决策规则从应用程序中分离出来,将对系统提供很大的便利!
例如 下面业务变更
对系统的使用人员
- 把业务策略(规则)的创建、修改和维护的权利交给业务经理
- 提高业务灵活性
- 加强业务处理的透明度,业务规则可以被管理
- 减少对IT人员的依赖程度
- 避免将来升级的风险
对IT开发人员
- 简化系统架构,优化应用
- 提高系统的可维护性和维护成本
- 方便系统的整合
- 减少编写“硬代码”业务规则的成本和风险
二、什么是Drools
Drools 是一个基于Charles Forgy’s的RETE算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。
业务分析师人员或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
Drools 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声明方式表达业务逻辑。可以使用非XML的本地语言编写规则,从而便于学习和理解。并且,还可以将Java代码直接嵌入到规则文件中,这令Drools的学习更加吸引人。
三、Drools 实战
下面我们将展示测试项目中使用drools的一个案例 数字匹配操作
- 循环打印 1 到 50,
- 是 5 的倍數就印 five,
- 是 7 的倍數就印 seven,
- 同時是 5 和 7 的倍數就印 five and seven,
- 否则打印数字本身
1、引入核心依赖jar包
2、定义controller层接口
3、定义rule规则
4、定义kmodule文件
5、启动项目 执行相关接口 [ 部分数据示例 ]
四、Drools规则属性
1、No-loop
作用:防止规则通过update之类的函数修改了Fact对象时,可能使规则再次被激活,从而导致死循环。
什么时候用?
当被修改的事实对象与规则LHS部分的约束条件为包含关系时。例如
否则,设置了no-loop为true也会出现死循环,例如
2、lock-on-active
作用:no-loop的升级版,一个更强大的解决死循环的属性。当规则提设置该属性为True时,则当前只会被触发一次。无论如何更新规则事实对象,当前规则也只能被触发一次。
例如
3、salience
作用:如果不设置salience属性,规则体的执行顺序为由上到下,否者,salience值越大,执行顺序越高。
例如:
4、enabled
作用:指规则是否可以被执行,若规则体设置为 enabled false,即将规则体视为永不激活。
例如:
5、dialect
作用:用来定义规则中要使用的语言类型,支持Mvel和Java两种类型的语言,默认情况下由包指定。
6、date-effective
作用:只有当前系统时间大于等于设置的时间或者日期,规则才会被激活。
例如:
7、date-expires
作用:与date-effective相反,只有当前系统时间小于设置的时间或者日期,规则才会被激活。
8、duration
作用:表示定时器,如果当前规则LHS部分为True,规则继续执行。如果该属性已经被弃用,那么通过新的属性timer来控制。
9、activation-group
作用:activation-group指激活分组,通过字符串定义分组名称,具有相同组名名称的规则体有且只有一个规则被激活,其他规则体的LHS部分仍然为true也不会被执行。该属性受salience属性的影响,如当前规则文件中的其他规则未设计该属性,则视为规则处于被激活状态,并不受该属性的影响。
10、agenda-group
作用:agenda-group是议程分组,属于另一种可控的规则执行方式,是指用户可以通过配置agenda-group的参数来控制规则的执行,而且只有获取焦点的规则才会被激活。
例如:ks.getAgenda().getAgendaGroup(“ag1”).setFocus();
如果有两个规则体的agenda-group属性相同,都可以被激活
11、auto-focus
作用:auto-focus 属性为自动获取焦点,即当前规则是否被激活,如果一个规则被执行,那么认为auto-focus为true;如果单独设置,一般结合agenda-group。当一个agenda-group没有获取焦点时,可以用auto-focus来控制。
12、timer
作用:用来控制规则的执行时间。
用法:
①timer(int:30s) timer(int:30s 5m)
②timer(cron:0/1****?)
③timer(int:30s 10s; start=3-JAN-2018,end=5-JAN-2018)
示例:
项目地址