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是一个不错的选择。