规则引擎二:Drools规则引擎

  • 原文链接:http://www.it165.net/pro/html/201503/36286.html

  • Drools是一个开源的规则引擎,经过多年的发展,也提供如下商业BRMS具备的功能组件:

    基于Eclipse的集成开发环境, 独立集中的规则存储库 基于WEB的规则维护环境 提供decision table 和 ruleflow等规则制品为规则的运行书写提供更多的灵活性

    本文将使用Drools来实现典型的风险评分,并将相关功能与IBM ODM/JRules做一个简单比较。客户风险评分具体需求参见"基于业务规则的客户风险评分"一文。

    模型

    Drools一般使用JavaBean作为事实模型,因此我们可以重用之前建立的Java XOM工程。

    Drools和IBM ODM/JRules在modeling方面的重要区别是,Drools没有BOM/XOM这样的两层对象模型映射体系,Java类型可同时直接供规则使用,即领域模型和规则(事实)模型两者是重叠的。虽然Drools也提供declarative的方式来定义规则模型,不过这种方式在我看来更多是作为Java类型的补充,而非用于解耦领域模型和规则模型(事实上两者的耦合在某种程度上反而被加强了)。

    Drools的这种设计当然从开发层面给用户提供了相当的便利性和灵活性,但缺少专用的规则模型无疑会给业务规则设计治理带来一定的麻烦,对于大型的复杂规则项目,这种麻烦可能是至关重要的。

    规则流设计

    IBM ODM/JRules中的规则流可以视为一个micro flow,仅仅用于规则执行的串联,既不能long-running,也不支持人工任务,和通常所说的工作流是两个不同的概念。Drools flow,其定位实际上是workflow,而非ruleflow(尽管其定义文件的后缀为"rf"),这一点从它提供的组件可以看出,如Event Wait,Task, Human Task都是典型的工作流引擎任务。

    至于Drools flow设计定位背后的缘由,Drools flow的文档解释如下:

    It is very difficult (and probably very inefficient as well) to extend a process engine to also take rules into account. The process engine would need to check for rules that might need to be executed at every step and would have to keep the data that is used by the rules engine up to date. However, it is not that difficult to "teach" a rules engine about processes. If the current state of the processes is also inserted as part of the Working Memory data the rules engine reasons about, and we instruct the rules engine how to derive the next steps of an executing process, the rules engine will then be able to derive the next steps taking rules and processes into account jointly.

    这种控制反转的思路在给流程提供了大量的灵活性的同时,使规则和流程可以无缝集成。一般的流程引擎,其流程的定义和规则决策通常是割裂的,流程决定何时即怎样调用规则引擎,实现通常牵涉复杂的数据和代码集成。

    在本文中,我们主要使用Drools flow实现规则执行控制,并不牵涉业务流程。

    下面我们看看风险评分规则流在Drools中的具体实现:

    规则流的设计基本上和ODM类似。由于Drools flow中不提供规则任务控制的某些特性,如initial action/final action,所以上图多了PreScoring和PostScoring节点,分别用于定义scoring规则执行前后的动作。

    规则设计

    下面的代码段是eligibility规则的设计,这里直接使用了drl规则语言(类似与IBM ODM中的irl语言)。

package com.decisionrule.riskrule

import com.decisionrule.risk.*;

global Result result;

rule "check amount"

ruleflow-group "eligibility"

when

req : Application(loanAmount > 1000000)

then

result.setQualified(false);

result.addMessage("the loan amount is more than 1 million");

end

rule "check age too young"

ruleflow-group "eligibility"

when

req : Application(m : applicant)

eval(m.getAge() < 18)

then

result.setQualified(false);

result.addMessage( "the applicant is too young" );

end

rule "check age too old"

ruleflow-group "eligibility"

when

req : Application(m : applicant)

eval(m.getAge() > 60)

then

result.setQualified(false);

result.addMessage( "the applicant is too old" );

end

Drools也提供DSL能力可以定义类自然语言的规则,不过个人感觉这种基于template和mapping实现的DSL缺乏一个真正语言的灵活性和扩展能力,在实际应用中不具备实用价值。我会在以后的blog中深入解释一下规则DSL相关的话题,在此不展开讨论。

风险要素的定义,风险评分和分级都是用了决策表,如下图所示:

Drools决策表利用了excel spreadsheet作为规则编辑器,来定义多个参数化的规则,条件和动作都通过script定义在对应的单元格中,结合参数组装成drl规则。这种实现思路总体而言是一种可行的轻量级的方式,从使用角度,需要结合两个工具(excel和eclipse),定义的时候不太方便,不过一旦决策表定义完成,理论上是可以交付给业务人员维护的。一些使用注意事项:

RULEFLOW-GROUP属性必须作为一个单独列在每一行定义,无法根据整个决策表一次性定义 CONDITION列无法访问global变量,必须实现把global变量放入工作内存 ACTION列中函数有多个参数时,无法把参数分开到多个列,必须在同一列中定义,用逗号分隔 决策表错误报告基于编译后的drl,可以使用SpreadsheetCompiler将drl打印出来,方便排错
总结

总体而言,无论从功能角度还是易用性的角度,虽然和商业产品还有一定的距离,Drools都是可以满足实际应用需求的。对于希望以较低的成本引入规则技术将业务逻辑从应用中剥离的企业,Drools是一个不错的选择。

延伸阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值