Drools 规则引擎案例

   日期:2024-12-26    作者:qnrsx 移动:http://ljhr2012.riyuangf.com/mobile/quote/46697.html

目前市面上比较热门的规则引擎有几款

  1. Ilog JRules 是最有名的商用BRMS
  2. Drools 是最活跃的开源规则引擎
  3. Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代表
  4. Visual Rules(旗正规则引擎)国内商业规则引擎品牌。

本文将着重介绍Drools。

一 为什么要使用规则引擎

有如下案例,充值得积分的案例 ,规则如下:

 

传统java业务实现如下

 

这时候由于市场需求变化,又要调整规则时候,则又要进行业务层面的代码修改、部署,十分麻烦。如果我们可以把决策规则从应用程序中分离出来,将对系统提供很大的便利

例如 下面业务变更

 
 

对系统的使用人员

  1. 把业务策略(规则)的创建、修改和维护的权利交给业务经理
  2. 提高业务灵活性
  3. 加强业务处理的透明度,业务规则可以被管理
  4. 减少对IT人员的依赖程度
  5. 避免将来升级的风险

对IT开发人员

  1. 简化系统架构,优化应用
  2. 提高系统的可维护性和维护成本
  3. 方便系统的整合
  4. 减少编写“硬代码”业务规则的成本和风险

二、什么是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
示例

 

项目地址


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号