- 1 -
Drools规则引擎在实现业务逻辑中的应用
摘 要:现今,企业级 java 应用中的业务逻辑越来越复杂,而这些复杂的业务逻辑又广泛
的分布在应用程序中。无论是软件的开发或是软件的维护,花费的成本都非常高,且软件开
发的难度将越来越大。而规则引擎可以通过将业务规则集中管理来降低实现复杂业务逻辑的
组件的复杂性,同时降低应用程序的维护和可扩展性成本。本文阐述了如何使用 Drools 规
则引擎使 Java应用程序的开发更能适应用户需求变化,降低软件开发的复杂度。
关键词:Drools,规则引擎,业务逻辑
1. 引言
要求施加在当今软件产品上的大多数复杂性是行为和功能方面的,从而导致组件实现具
有复杂的业务逻辑。企业级 Java应用中业务逻辑最常见的方法是编写 Java代码来实现需求
文档的规则和逻辑。在大多数情况下,代码的错综复杂性使得维护和更新应用程序的业务逻
辑成为一项令人畏惧的任务,甚至对于经验丰富的开发人员来说也是如此。业务逻辑需求的
任何更改,不管多么简单,仍然会产生重编译和重部署的成本。
而与此同时,出于以下原因,实现应用程序业务逻辑的组件可能必须更改[4]:
(1)在开发期间或部署后修复代码缺陷;
(2)应付特殊状况,即客户一开始没有考虑到的业务逻辑;
(3)处理客户已更改的业务目标;
(4)符合组织对敏捷或迭代开发过程的使用。
如果存在以上这些可能性,尤其是当更改复杂 if-else逻辑的开发人员并不是以前编写代
码的开发人员时,则更迫切需要一个无需太多复杂性就能处理业务逻辑更改的应用程序。
2. Drools规则引擎
Drools是 Codehaus的一个开源项目。最近被纳入 JBoss门下,更名为 JBoss Rules,成
为了 JBoss应用服务器的规则引擎。
Drools是用Java语言编写的开放源码规则引擎,基于Charles Forgy的RETE算法[2]的规则
引擎的实现。Drools允许使用声明方式表达业务逻辑。可以使用Java/XML语法编写规则,这
对于入门Drools十分有用,因为Java代码可以直接嵌入规则文件中。Drools还具有如下一些
优点:
(1)非常活跃的社区;
(2)易用;
(3)快速的执行速度;
(4)在 Java 开发人员中流行;
(5)JSR 94[1]兼容(JSR 94 是 Java Rule Engine API);
(6)免费。
3. 本文所使用的实例
本文利用一个简单的实例来说明如何使用 Drools规则引擎来实现业务逻辑。
- 2 -
下列假设为应用程序解决的虚构问题设置了场景:
(1)某人的年龄大于或等于 18岁,则允许登记信用卡;
(2)某人的年龄小于 18岁,则不允许登记信用卡。
不利用规则引擎实现的代码实例
清单 1. 使用 if-else 语句实现业务规则逻辑
String personName = ();
int age = ();
if (age >= 18) {
("credit allowed for " + personName);
} else {
("credit denied for " + personName);
}
清单 1中的代码只是一个实例,很简单,不是太复杂。但是企业级 java应用中的业务
逻辑要远比这个复杂得多。如果要对这些复杂的业务逻辑进行更改,需要十分小心。一堆互
相缠绕的 if-else 语句正试图捕获已经为应用程序标识的业务逻辑。如果您对业务规则不甚
了解,就无法一眼看出代码的意图[4]。
利用 Drools规则引擎实现的代码实例
(1)规则
规则是对商业知识的编码。一条规则有 attributes,一个 Left Hand Side(LHS)和一个
Right Hand Side(RHS)。
清单 2.规则的一般形式
rule "name"
<attribute> <value>
when
<LHS>
then
<RHS>
End
业务规则的理论基础是:设置一个或多个条件, 当满足这些条件时会触发一个或多个操
作[3]。规则的LHS由一个或多个条件(Conditions)组成。当所有的条件(Conditions)都满
足并为真时,RHS将被执行。
RHS被称为结果(Consequence)。LHS 和 RHS 类似于清单 3中的 if语句:
清单 3.与规则等价的 if语句
if (<LHS>) {
<RHS>
}
(2) 本文中所用实例的规则文件
- 3 -
清单 4. 本文中所用实例的规则文件 (截取)
rule "Credit Allowed"
when
person : Person( age >= 18 )
then
( "credit allowed for " + () );
end
rule "Credit Denied"
when
Person( personName : name, age < 18 )
then
( "credit denied for " + personName );
end
(3)构建核心代码
drl规则文件创建后,它们被读入一个解析器,使用 ANTLR 3语法进行解析。解析器对
语法进行正确性的检查,然后产生一种中间结构“descr”,descr用 AST来描述规则。AST然
后被传到 PackageBuilder,由 PackagBuilder来产生 Packaged对象。PackageBuilder 还承担
着一些代码产生和编译的工作,这些对于产生 Package对象都时必需的。
RuleBase是一个运行时组件,它包含了一个或多个 Package对象。可以在任何时刻将一
个 Package对象加入或移出 RuleBase对象。一个 RuleBase对象可以在任意时刻实例化一个
或多个WorkingMemory对象,在它的内部保持对这些WorkingMemory的弱引用。
WorkingMemory由一系列子组件组成。当应用程序中的对象利用 assertObject()方法被 assert
进WorkingMemory后,调用 fireAllRules()方法来执行规则。
清单 5. 本文中所用实例的核心代码 (截取)
// PackageBuilder提供了简便的API,利用addPackageFromDrl方法
// 从传入的Reader实例产生descr AST模型。
PackageBuilder builder = new PackageBuilder();
try {
Reader arg0 = new
InputStreamReader(("/"));
(arg0);
} catch (DroolsParserException e) {
();
} catch (IOException e) {
();
}
// RuleBase用RuleBaseFactory来实例化,默认返回一个ReteOO RuleBase。
// 可以传入参数来指定采用ReteOO或Leaps。
// 然后,用addPackage方法加入Package实例。
RuleBase ruleBase = ();
try {
(());
- 4 -
} catch (Exception e) {
();
}
// rulebase保持着到它所产生的WorkingMemoryd的弱引用
WorkingMemory workingMemory = ();
// 业务逻辑相关代码
// ……
// 调用fireAllRules()激发规则
();
这样,原本需要写在程序中的业务逻辑便抽取出来,形成一个规则文件,当我们需要修
改这些规则的时候就不需要对编译好的代码进行修改,而只是修改一下规则文件中的具体规
则即可。同时也就省去了重新编译和部署的成本。另一方面,对规则的集中管理也使得开发
和维护人员将更多的精力投入到程序的流程上,而业务规则也可以由熟悉业务逻辑的规则管
理人员来进行集中开发和维护上。从而大大提高了应用的开发效率和维护成本。
4. 结束语
本文简单介绍了基于规则开发应用系统的一些主要概念,并用Java和Drools开发了一个
基于规则引擎的示例应用。从实例可以看出规则引擎技术为管理多变的业务逻辑提供了一种
解决方案。规则引擎既可以管理应用层的业务逻辑又可以使表示层的页面流程可订制。这就
给软件架构师设计大型信息系统提供了一项新的选择。
- 5 -
参考文献
[1] 缴明洋 谭庆平. Java规则引擎工作原理及其应用. 计算机与信息技术, 2006-04-06.
[2] :a fast Algorithm for the many pattern/many object pattern match problem[J].Artificial
Intelligence,1982:17-37.
[3] 李国乐. Java规则引擎与其API. 2005-07-01
[4] Ricardo Olivieri. 使用 Drools规则引擎实现业务逻辑.
2006-06-19
Application of Business Logic with Drools Rule Engine
Liu Ji,Zhao Guangli
Dalian Maritime University, Dalian Liaoning (116026)
Abstract
Nowadays, in enterprise Java application, business logics become more and more complicated, and
these complex business logics are widespread distributed in the application. The costs both in the
perspective of development and maintenance are very high, and very difficult. But rule engine, which
centralized manage the business rules, can reduce the complexity of the realization of complex business
logics, in mean while, reduce the costs of development and maintenance. This paper will show you
how to use Drools to do this in an enterprise Java application.
Keywords: Drools; Rule Engine; Business Logic
作者简介:
刘际,男,大连海事大学计算机学院硕士研究生,在Web架构以及企业级 Java应用方面有
较丰富的经验;
赵广利,男,副教授,大连海事大学计算机学院硕士生导师,主要从事网络方向的研究。