规则引擎 Ilog Jrules 开发基础教程
平安科技系统开发十一部 石新 2012-07-12
1. 概述篇
规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来。规则引
擎使用特定的语法编写业务规则,规则引擎可以接受数据输入、解释业务规则、并根据业务规则做出相应
的决策。
通俗来说,规则引擎就是负责执行系统中规则的插件,亦可以作为一个远程系统供业务系统调用。
什么是规则:所有的业务逻辑都可以看做是规则。
引入规则引擎后带来的好处:
1 实现业务逻辑与业务规则的分离,实现业务规则的集中管理
2 可以动态修改业务规则,从而快速响应需求变更
3 使业务分析人员也可以参与编辑、维护系统的业务规则
4 使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单
其实:参数化就是一种让客户自己维护系统的业务规则的方法。
目前最好的商用规则管理系统 BRMS 是 ILOG JRules,最普遍使用的开源规则引擎是 Drools。
Ilog Jrules 是完整的业务规则管理系统(BRMS),它提供了对整个企业业务规则进行建模、编写、测试、
部署和维护所必需的所有工具。
Ilog Jrules 主要包括以下 4 个组件:
Rule Studio(RS):
基于 Eclipse 的开发环境,面向开发人员使用,用于规则的建模和编写。
Rule Scenario Manager:
规则测试工具。平安未购买,平安自己开发了一个“业务规则管理系统二代(BRMS2)”用于规则测
试
Rule Team Server(RTS):
基于 Web 的管理环境,面向业务人员使用,用于规则发布、管理、存储。
Rule Execution Server(RES):
面向运维人员使用,用于规则执行、监控。
1 / 27
软件获取位置:\\iqsz-d4540\share\toEveryone\JRules 7.x
2. 安装篇
本文安装 Rule Studio 版本为 7.1.1.3,7.1.1.3 是 7.1.1 的扩充版本,所以要先安装 7.1.1,再在 7.1.1 的安
装目录下再安装 7.1.1.3。7.1.1.2 是免费适用版本,试用期 90 天,想自学的同学可下载 7.1.1.2 版本适用。
安装顺序:(以下程序的安装需要申请管理员权限)
1、安装 Ilog JrulesV7.1.1
a、JRules_V711_CZLX7ML.exe
依次按提示选择路径,华丽地点击“下一步”即可。
b、JRules_V711_Doc_zh_CN_CZM12SC.exe(中文补丁,安装同上)
2 / 27
2、安装 Ilog JrulesV7.1.3【安装路径为 V7.1.1 版本的路径】
a、JRules7.1.1.3.exe
7.1.1.3 的安装路径要用 7.1.1 的安装路径,若已安装 7.1.1,除了盘符,程序会自动选择
WebSphereIlogJrules711。若没有安装 7.1.1,7.1.1.3 的安装过程将会报错。
b、zh_CN_Doc_7.1.1.3.exe(中文补丁,安装同上)
注意:中文补丁的安装在使用本教程时是必需的,因为这里的中文补丁并不只是对工具菜单的中文化,而
且也是对规则语法的中文化,如不安装补丁,语法与中文语法会有差异。因为有的时候规则是需要手工编
写,所以对英语不是那么自信的同学还是建议使用中文版。
3 / 27
未安装中文补丁:
已安装中文补丁:
安装好后,即可在开始菜单中打开 Rule Studio(zh_CN)
4 / 27
3. 开发篇
3.1 准备 BOM
在编写任何规则之前必须准备好规则中要用到的词汇,规则的词汇在业务对象模型中定义。业务对象
模型 (BOM) 定义了规则工件中可使用的操作和实体。规则编写基于 BOM,语法由 IRL 定义。BOM 的定
义又依赖于规则执行的 XOM(物理对象模型 eXecutable Object Model),XOM 可以是 java 类、XML、WSDL。
BOM 是通过 XOM 映射定义的虚拟的规则实体。BOM 与 XOM 的映射不一定必需是一对一的映射,一个
BOM 可以定义 XOM 中不存在的属性,只要有明确的 BOM 属性定义即可,但这样的属性只可以在规则内
部使用。
规则:
如果
'Customer Info' 的 age 小于 18
那么
设置 'Customer Info' 的当前 result 为 “REJECT” ;
物理对象模型:
public class CustomerInfo implements Serializable{
/**
* @author SHIXIN747
*/
private static final long serialVersionUID = -580320839476217224L;
private String custName; //客户姓名
private int age;
private String sex; //性别
//年龄
5 / 27
private ApplicationInfo applicationInfo; //当前 申请
private List historyLoanList; //历史贷款列表信息
private Date birthDay; //生日
private double verifiedIncome; //核实收入
private boolean risk; //是否存在风险
private String rusult; //评估结果
setters and getters ……
}
3.1.1 准备 XOM
操作过程就是在 Rule Studio 创建普通的 Java 类:
文件新建其他选择 Java 项目下一步输入项目名称完成。
本教程中新建的 XOM 代码如下:
注:若规则项目使用 EJB 调用,Java 类需实现 Serializable 接口,并生成 serialVersionUID。
代码 1:
package com.paic.cfs.application;
import java.io.Serializable;
public class ApplicationInfo implements Serializable{
/**
* @author SHIXIN747
*/
private static final long serialVersionUID = 3228480902812648982L;
private String statusCode;
private String followCode;
private String loanCode;
public String getStatusCode() {
return statusCode;
}
public void setStatusCode(String statusCode) {
this.statusCode = statusCode;
}
public String getFollowCode() {
return followCode;
}
public void setFollowCode(String followCode) {
this.followCode = followCode;
}
public String getLoanCode() {
return loanCode;
}
public void setLoanCode(String loanCode) {
this.loanCode = loanCode;
6 / 27
}
}
代码 2:
package com.paic.cfs.customer;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import com.paic.cfs.application.ApplicationInfo;
public class CustomerInfo implements Serializable{
/**
* @author SHIXIN747
*/
private static final long serialVersionUID = -580320839476217224L;
private String flag; //规则调用标志
private String custName; //客户姓名
//年龄
private int age;
private String sex; //性别
private ApplicationInfo applicationInfo; //当前 申请
private List historyLoanList; //历史贷款列表信息
private Date birthDay; //生日
private double verifiedIncome; //核实收入
private boolean risk; //是否存在风险
private String rusult; //评估结果
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
7 / 27
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public ApplicationInfo getApplicationInfo() {
return applicationInfo;
}
public void setApplicationInfo(ApplicationInfo applicationInfo) {
this.applicationInfo = applicationInfo;
}
public List getHistoryLoanList() {
return historyLoanList;
}
public void setHistoryLoanList(List historyLoanList) {
this.historyLoanList = historyLoanList;
}
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
public double getVerifiedIncome() {
return verifiedIncome;
}
public void setVerifiedIncome(double verifiedIncome) {
this.verifiedIncome = verifiedIncome;
}
public boolean isRisk() {
return risk;
}
public void setRisk(boolean risk) {
this.risk = risk;
}
public String getRusult() {
return rusult;
}
public void setRusult(String rusult) {
this.rusult = rusult;
}
}
8 / 27