引言
业务规则管理系统(BRMS)在电信,银行和政府等各行业中广泛使用,用来支持业务规则的编辑,管 理和部署,以适应业务的快速变化。Drools 是一款基于 Java 的开源产品,包括业务规则执行引擎和业务规则管理系统。本文首先介绍了业务规则引擎和业务规则管理系统的基本概念和体系结构,然后介绍一个智能交通系统中 的典型业务场景,最后展现如何通过使用 Drools BRMS 来实现这个业务场景,并根据不同的业务需要灵活配置这些业务规则。
基本概念介绍
智能交通系统中的业务规则简介
智 能交通系统中的道路收费系统的基本业务场景是:载有特定装置(通常是电子标签装置或者是有全球卫星定位功能的装置)的车辆进入收费区后,收费区的信号探测 器发出扫描信号,检测并获取该车的有关信息,譬如信号探测系统能够获取并记录诸如车辆的几何尺寸、车重、车型等数据。对于没有安装这种装置的车辆来说,系 统可以通过摄像机拍摄记录获得车型、车牌号等信息。然后根据不同的收费业务规则,针对不同的车辆采取不同的收费标准。
目前主要的道路收费业务规则有基于特殊道路使用收费、基于区域收费和基于距离 / 时间收费等。
- 基于特殊道路使用收费:这种收费模式通常是针对特殊的道路,如某条高速公路。这种收费的业务规则比较简单,当车辆通过一次收费检测点就收取一次费用。基于特殊道路的使用收费模式还广泛应用在城市拥堵费收取中。当车辆通过某条比较拥堵的公路时,就会被收取相应的费用。
- 基于区域收费:这种收费模式是指在某个指定的区域内对行驶车辆收取一定的费用。需要记录车辆何时何地进入指定区域以及何时何地离开,当获得完整的车辆进入和离开的信息以后,将会产生一次计费。
- 基 于距离 / 时间收费:这种收费模式通常应用在整个国家的公路网,可以覆盖所有的车辆类型,收费的业务规则是以车辆行驶的距离(时间)为输入。首先在车辆上安装一个特 殊的车载器件(目前运用很多的是有全球卫星定位功能的仪器),当装有 GPS 仪器的车辆在开上高速公路后,收费系统借助于卫星信号和其他定位传感器,得到车辆的位置,通过卫星定位系统确定车辆在高速公路上行驶的里程,然后进行结 算,自动统计缴费额,并把数据按一定间隔时间发送到道路收费中心,由收费中心向拥有车辆的运输公司开出账单,收取这段里程的道路使用费用。
业务规则引擎(Rule Engine)
前 面提到的智能交通系统中的业务规则,是业务场景中真实存在的,为了实现这些业务规则,我们可以通过在程序代码里,用各种编程语言和其他业务逻辑同样的实 现。但是由于业务规则的易变性,很容易导致程序代码的重写,无疑会增加维护的成本和无法快速反应需求的变化。业务规则引擎提供了对业务规则解析执行。降低 实现业务逻辑的复杂性,提高了应用程序的可维护性和可扩展性。
业务规则管理系统 (BRMS)
业 务规则管理系统是在业务规则引擎基础上的扩展,提供了一套包含业务规则整个生命周期的管理系统。减轻了业务规则维护的工作量。降低了复杂性,方便用户而不 是技术专家来管理业务规则。提供了业务规则动态修改的能力,即业务人员通过在系统中改变业务规则文件,应用程序无需重新装载,就能及时反应规则的变化。
Drools BRMS 4.0.7 简介
Drools BRMS 是一个 Web 应用程序,可以部署在大部分的支持 J2SE 1.5 的 Web 容器下,如 Tomcat 5.5。Drools BRMS 是从 Drools 的 4.0 版本之后加入的,我们使用的版本是 4.0.7。
Drools BRMS 架构体系分为三大部分,第一部分是 UI 层,提供了一个基于 Ajax 技术的业务规则编辑、管理工具。利用 Google Widget Toolkit(GWT)实现 Ajax 技术,提供了较好的用户体验。第二部分是规则文件仓库层,将规则文件统一保持在文件系统或关系数据库。基于开源 Apache 工具的 JackRabbit 实现。JackRabbit 是一种支持结构化和非结构化数据的内容存储,是 Java 内容仓库规范 JCR 的一个实现。最后一个是 Drools 的核心引擎,用来对用户提交的规则文件进行验证、编译和部署。
开发人员通过规则文件的编辑部署,生 成了包含 rule 的 package 对象,这是引擎可直接操作的内存对象。BRMS 通过一个 URL 提供对这个对象的 HTTP 访问。第三方可以通过 RuleAgent 的 API 来访问这个 URL,程序自动下载这个 Package 对象就直接可以在规则引擎运行,得到规则执行的结果。整个结构如下图所示
图 1. Drools BRMS 组件
详细业务规则抽取
这里以一个高速公路收费的场景为例,抽取其中详细的计费业务规则。此业务规则是前面介绍过的基于特殊道路使用的收费模式的一种应用,当车辆通过一次收费检测点就收取一次费用,产生一条收费账单。对于不同的车辆,通过不同的道路,将会被收取不同的费用。
业务规则输入
不同的道路类型、收费检测点类型、车辆类型、账户类型、车辆使用类别和不同的通行时间会产生不同的费用。这些信息都将作为计费业务规则的输入。
- 道路运营商代码
- 收费检测点代码
- 车辆通过收费检测点时间
- 车辆类型 ( 摩托车、小型轿车、卡车等 )
- 车辆用途类别
- 车辆识别方法 ( 通过电子标签识别、通过车牌摄像识别等 )
- 车辆绑定账户类别
业务规则输出
- 收费项目列表 ( 如道路基本使用费、附加费和折扣等 )
- 收费项目明细 ( 包括收费类别以及费用金额 )
业务规则抽取结果
- 道路使用费的业务规则
如 果车辆安装合法的电子标签设备,当车辆通过收费站时,系统将通过读取电子标签的内容识别车辆信息。如果车辆未安装合法的电子标签设备,系统会启动摄像头拍 摄车辆通过时的图片,自动识别图片中的车牌信息。如果系统无法自动识别,将通过人工识别获得车辆信息。无论是通过电子标签识别,自动车牌识别,还是人工识 别,当获得车辆本身信息以及车辆绑定的账户信息之后,可以根据相应的业务规则计算出道路使用费用。
一个简单的道路使用计费规则如下表所示:
道路运营商代码 | 收费检测点代码 | 车辆绑定账户类别 | 车辆类型 | 日期 | 时间 | 车辆用途类别 | 道路基本使用费 | |
---|---|---|---|---|---|---|---|---|
1 | 201 | 001 | ANNUAL | 1 | 2,7 | 8,24 | A | 5.1 |
2 | 201 | 001 | ANNUAL | 1 | 2,7 | 0,8 | A | 4.9 |
3 | 201 | 001 | ANNUAL | 1 | 1,1 | 8,24 | A | 5 |
4 | 201 | 001 | ANNUAL | 1 | 1,1 | 0,8 | A | 3.3 |
5 | 201 | 001 | ANNUAL | 2 | 2,7 | 8,24 | B | 6.5 |
6 | 201 | 001 | ANNUAL | 2 | 2,7 | 0,8 | B | 5.3 |
7 | 201 | 001 | ANNUAL | 2 | 1,1 | 8,24 | B | 5.4 |
8 | 201 | 001 | ANNUAL | 2 | 1,1 | 0,8 | B | 3.7 |
9 | 201 | 001 | TEMP | 3 | 2,7 | 8,24 | C | 5.2 |
10 | 201 | 001 | TEMP | 3 | 2,7 | 0,8 | C | 3.4 |
- 附加费用的业务规则
在 3.3.1 中,我们提到,系统可能会通过不同的方法识别车辆:电子标签识别(TAG),自动识别车牌(OCR)或人工识别车牌 (MIR),不同的识别方法可能产生不同的附加费用。电子标签识别快速、简单,这里附加费用为 0。自动车牌识别将启用光学图片识别引擎来识别车牌,产生一定的附加费(0.5 元)。而人工识别则是在自动车牌识别失败后,通过人眼辨别图像识别车辆,需要耗费更多的系统资源和人力,产生了较高的附加费用(1 元)。附加费用的收取可以鼓励车主使用电子标签,使得收费更快捷简单。
序号 | 车辆识别方法 | 附加费 |
---|---|---|
1 | TAG | 0 |
2 | OCR | 0.5 |
3 | MIR | 1 |
- 折扣的业务规则
用户在为车辆注册绑定账户时,可以选择不同的账户类型,如临时账户 (TEMP)、年结算账户(ANNUAL),不同的账户类型可以给予不同的优惠。
序号 | 车辆绑定账户类别 | 折扣 |
---|---|---|
1 | ANNUAL | -0.2 |
2 | TEMP | -0.4 |
应用开发
基 于上面的介绍,我们了解了一个典型的业务场景。下面我们介绍如何用 Drools 实现这个业务场景。我们首先要建立一个完整的规则库,包括在 Drools BRMS 上建立工作目录,业务对象建模以及基于决策表的规则文件编写。其次我们编辑了一个简单的用户界面来调用规则引擎。最后我们介绍对规则进行的修改能够在我们 的用户界面上及时展现。
建立工作目录(Package)
工作目录是存放业务规则文件,业务对象以及其他一些规则相关对象的地方。将 Drools BRMS 安装到 Tomcat 并启动后,打开 URL:http://localhost:8080/drools-jbrms/org.drools.brms.JBRMS/JBRMS.html,点击 Login 进入系统,我们就可以看到系统的主界面。
Drools BRMS 以包的方式管理所有相关的规则文件,函数和业务对象模型等。我们点击“create new package”的图标,创建一个名为 com.sample.rule 的工作目录。以后我们将在这个包下创建规则和业务对象模型。
图 2. Drools 的主界面
业务对象建模
BOM(Business Object Model) 是业务规则引擎所要操作的对象。在 Drools 中业务对象就是普通的 Java 对象。我们建立一个叫做 RuleInput 的对象如图 3 所示,这是一个保存输入输出参数的对象。包含 identifyMethod,detectionTime,detectionPointCode,accountType,vehicleClass,dayOfWeek,timeOfDay,operator,purposeOfUse, 这些都是作为判断条件的参数,而 TollFee,AdminFee 和 Discount 对应三种计算所得的子项,存放通行费,附加费和折扣值。
图 3. 业务对象 RuleInput
在 com.sample.rule 包下创建一个叫做 RuleModel 的模型归档文件。将前面的 Java 文件导出成 Jar 包,点击上传图标上传到 Drools BRMS 中。
图 4. 上传业务对象模型
在 包的配置中添加类路径,以便系统装载这个 RuleInput 类。点击工作目录 com.sample.rule,选择 Edit Page Configuration,如图 5 在 Header 编辑框里,添加“import com.sample.rule.RuleInput”, 点击 save and validate configuration 按钮来保存配置。这样就完成了一个业务对象模型。
图 5. 添加类路径
基于决策表的规则文件
这 一步我们就要进入关键的一步了——创建和编辑规则文件。Drools 支持多种业务规则的定义方式,如基于业务规则语言 drl(Drools Rule Language)的方式,基于自然语言的方式和基于决策表的方式等。决策表是一种简单但是精确的表示规则的方式,容易使业务人员理解和使用。所以我们采 用基于决策表来定义我们的业务规则。决策表可以用 MS office 或 OpenOffice 编辑。其中的一行就是一条规则,分为条件和动作两部分,如果满足条件则执行相应的动作。
决策表包括以下几部分:
- 规则集合的定义
一个文件对应一个规则集合,可以包含多个规则表。第二行关键字 RuleSet,其值和工作目录名一致。Import 关键字定义规则引擎装载业务对象的类路径。Notes 关键字是用来注释这个规则集合的用途。
- 规则表的定义
每 个规则表,分为表格头和表格体两部分。表头定义表格的模板信息。第六行 RuleTable 关键字表示一个规则表从这里开始。第七行说明所在列是条件还是动作。第八行表示规则所要操作的对象模型,我们声明了一个 fee 变量,它的类型是前面定义的 RuleInput 类。在动作那一列我们就可以使用 fee 这个变量了。第九行就是条件模板或者动作模板,定义了输入业务模型实例的属性满足条件模板就执行动作模板,例如输入的 RuleInput 实例如果 operator==201,则满足了表格体的第一行第一列条件。同样,如果车辆被探测到的时间在 8 点到 24 点之间,那么满足了表格体的第一行第六列条件。其中 $1 表示第一个参数,$2 表示第二个参数,当只有一个参数时,就用 $param 来表示。第十行是对各个属性的描述。
图 6. 基于决策表的规则文件——计算通行费
同样,我们定义了两个决策表来计算附加费和折扣
图 7. 基于决策表的规则文件——计算附加费和折扣
通过上面的描述,我们定义了一个完整的规则文件。然后我们就可以上传到 Drools BRMS 上了。打开刚才的 URL,首先要创建一个类别,选择左边的 Admin 菜单,选择 Manage Category 页,创建一个 SampleCtg 类别。
图 8. 创建类别
然后点击“create new rule”图标,创建一个 Business Rule Asset,命名为 SampleRule。类别选择刚才的 SampleCtg,选择规则类型为决策表类型。然后上传决策表文件。
图 9. 上传规则文件
上传之后,点击 Validate 按钮来验证上传的规则文件是否正确。如果有错误就根据提示进行改正,再次上传验证直到验证通过。
最 后一步就是发布这个业务规则,发布时 Drools BRMS 提供了一个 http 地址,这样客户端可以通过这个地址访问到这个业务规则。点击包 com.sample.rule,选择右边的 Build, Validate and deploy 栏目,点击 Build Package,然后点击 Create snapshot for deploy 键,命名为 TollRule,点击创建,这样就完成了发布。在 Deployment 菜单我们可以看到发布的规则文件地址为http://localhost:8080/drools-jbrms/org.drools.brms.JBRMS/package/com.sample.rule/TollRule。
图 10. 发布规则
调用程序
我 们开发了一个简单的 JSP web 客户端来模拟实际的业务系统,需要调用 Drools BRMS 来显示规则执行的结果。Drools 的核心包中提供了一个 RuleAgent 的 API,能够动态地访问在 BRMS 上发布的业务规则文件。RuleAgent 能够将规则文件下载到本地并装载到规则引擎进行解析执行。RuleAgent 需要一些参数进行初始化对象,这些参数保存在一个配置文件中,用单例模式装载配置文件生成一个唯一的 RuleAgent 对象。从 RuleAgent 得到一个 StatefulSession,就可以执行规则了。在 session 对象中注入前面定义的一个 RuleInput 对象。fireAllRules() 就执行了所有的规则。得到的结果保存在 RuleInput 的输出属性中。
清单 1. 执行规则的关键代码
public class ChargeSessionHelper {
private static RuleAgent agent;
private static StatefulSession session;
public static StatefulSession getSession(){
if(agent==null){
agent=loadRuleAgent();
}
//get ruleBase intance
RuleBase ruleBase=agent.getRuleBase();
//create StatefulSession
session=ruleBase.newStatefulSession();
return session;
}
private static RuleAgent loadRuleAgent() {
//initialize the parameters from the property file,get a RuleAgent instance
return RuleAgent.newRuleAgent("/rules.properties");
}
}
public RuleInput excute(){
//create StatefulSession
StatefulSession session=ChargeSessionHelper.getSession();
//insert an instance of RuleInput
session.insert(input);
//fire all the rules
session.fireAllRules();
//destroy the StatefulSession
session.dispose();
//return the result, stored in the input object
return input;
}
Rules.properties 文件包含基本的配置信息。newInstance 如果设为 false,那么 RuleAgent 不需要每次都创建一个 RuleBase,当服务器规则文件更新时,StatefulSession 能够自动更新。url 是设置成服务器上已部署的规则文件地址。poll=30 表示 RuleAgent 每隔 30 秒都会轮询一次 url 规则是否有更新。Name 表示这个 RuleAgent 的名字,将会出现在日志里。localCacheDir 表示将服务器上的规则文件缓存到本地的目录,这个属性大大提高性能,当服务器规则发生改变时,本地的缓存文件也会自动更新。
清单 2. 客户端连接业务规则管理系统的配置
newInstance=false
url=http://localhost:8080/drools-jbrms/org.drools.brms.JBRMS/
package/com.sample.rule/TollRule
poll=30
name=TollRule
localCacheDir=c:/temp
下图是我们的一个调用界面
图 11. 业务系统模拟
规则的动态修改
Drools BRMS 提供了规则动态修改的功能。当业务规则发生变化,如 OCR 附加费从 50 提高到了 80,我们只需要将第二张决策表的 50 改成 80,重新上传这个文件,并且发布这个业务规则。不需要重新启动应用,修改后的规则能够实时地应用到业务系统中,即我们的规则调用页面刷新后,就能展现附 加费从 50 提高到了 80
总结
Drools BRMS 虽然相比商业化的业务规则管理系统还有一些不足,但却是目前较好的开源业务规则管理系统。在基于 Drools 这个强大的开源规则引擎上,提供了一个轻量级的管理系统。基于 Web 2.0 Ajax 技术,提供了较好的用户友好度,支持规则文件的上传,编辑,版本管理,编译部署等整个过程。实现了业务规则的动态配置。满足在业务规则频繁更新的行业中应 用。
本文介绍了如何通过业务规则管理软件 Drools BRMS,实现智能交通系统中的业务规则。为了展示规则的动态修改,我们开发了一个 Web 客户端来访问规则。
来源:oschina
链接:https://my.oschina.net/u/922576/blog/616820