编辑推荐: |
本文来自于csdn,文中对现状进行了分析,对于一些问题给出了解决方案,简单介绍结合案例说明。 |
|
1 现状分析
1.1 现状
在很多行业应用中比如银行、保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中。
1.2 问题
主要存在的问题有以下几个方面:
1) 当业务规则变更时,对应的代码也得跟着更改,每次即使是小的变更都需要经历开发、测试验证上线等过程,变更成本比较大。
2) 长时间系统变得越来越难以维护。
3) 开发团队一般是由一个熟悉业务的BA(业务分析人员)和若干个熟悉技术的开发人员组成,开发人员对业务规则的把握能力远不及BA,但实际上却承担了将业务规则准确无误实现的重任。
4) 系统僵化,新需求插入困难。
5) 新需求上线周期较长。
1.3 解决方案
能否让我们的业务系统更灵活一点呢?
思路:将业务规则从技术实现中提取出来,实现技术和业务分离,开发人员处理 技术、业务分析人员定义业务规则,各自做自己所擅长的事情。
方案:目前已经有比较成熟的开源产品支持,这就是本文所要介绍的Drools,我们将业务规则定义在Database或者BRMS(Business
Rule Management System)中,通过管理DB或者BRMS实现业务逻辑的动态改变。
1.4 适用情景
什么时候应该使用规则引擎?
虽然规则引擎能解决我们的许多问题,但我们还需要认真考虑一下规则引擎对我
们的项目本身是否是合适的。需要关注的点有:
我的应用程序有多复杂?
对于那些只是把数据从数据库中传入传出,并不做更多事情的应用程序,最好不要使用规则引擎。但是,当在Java中有一定量的商业逻辑处理的话,可以考虑Drools的使用。这是因为很多应用随着时间的推移越来越复杂,而Drools可以让你更轻松应对这一切。
我的应用的生命周期有多久?
如果我们应用的生命周期很短,也没有必要使用Drools,使用规则引擎将会在中长期得到好处。
我的应用需要改变吗?
这个答案一般情况下是肯定的,“这世界唯一不变的只有变化”,我们需求也是这样的,无论是在开发过程中或是在开发完成以后,Drools能从频繁变化的需求中获得好处。
2 什么是规则引擎
规则引擎是基于规则的专家系统的核心部分,主要由三部分组成:规则库(Knowledge base)+Working
Memory(Fact base)+推理机(规则引擎),规则引擎根据既定事实和知识库按照一定的算法执行推理逻辑得到正确的结果。
3 Drools简介
Drools 是一个基于Charles Forgy's的RETE算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。
业务分析师人员或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
4 竞争产品比较
与Drools功能类似的同类开源产品主要有:OpenRules、OpenLexicon等,商业产品功能比较强也比较贵,这里不做比较,主要差别如下表:
5 开发环境搭建
打开Drools主页(http://www.jboss.org/drools ),我们可以看到如下界面。
其中,Drools Expert是我们想要的,这个是规则引擎。
Drools Guvnor这个是BRMS系统,如果我们需要将业务规则存储在BRMS中,可以安装Guvnor。
Drools Flow这个是工作流引擎,本文不作介绍。
选择Drools Expert进入如下页面:
下载红色的这三项。
安装Drools:
解压缩drools-5.0-bin.zip到任意目录,比如:D:/tools/drools/drools-5.0-bin
解压缩drools-5.0-eclipse-all.zip到eclipse的安装目录
启动eclipse,查看工具栏是否有drools的图标,如果有则说明安装正常。
否则,打开菜单->windows->open perspective->other->drools。如果perspective当中也没有,请删除eclipse/configuration/org.eclipse.update目录,再重启eclipse。
配置drools的Runtime环境,就是要指向drools-5.0-bin目录
至此,开发环境已经搭建好了。
6 创建HelloWorld程序
创建一个HelloWorld的程序也很简单。
l 新创建一个项目,选Drools Project
输入项目名称和路径:
选择Demo文件,这里我们全部勾选:
点完Finish,可以看到如下界面,我们的Demo已经创建完了。
运行DroolsTest和DecisionTableTest类,均可以看到有如下输出:
Hello World
Goodbye cruel world
到这里我们的HelloWorld已经创建完了,没有写一行代码,简单吧?
主要生成文件:
Sample.drl—基于DRL的规则库
Sample.xls—基于Decision table 的规则库
DroolsTest—Sample.drl的测试代码
主要代码如下:
public class DroolsTest
{
public static final void main(String[] args)
{
try {
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger (ksession,
"test");
// go !
Message message = new Message();
message.setMessage ("Hello World");
message.setStatus (Message.HELLO);
ksession.insert (message);
ksession.fireAllRules();
logger.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
private static KnowledgeBase readKnowledgeBase()
throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add (ResourceFactory.newClassPathResource ("Sample.drl"),
ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error : errors)
{
System.err.println(error);
}
throw new IllegalArgumentException("Could
not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages (kbuilder.getKnowledgePackages());
return kbase;
}
public static class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
public int getStatus() {
return this.status;
}
public void setStatus(int status) {
this.status = status;
}
}
} |
主要功能:
1) 读取并创建知识库。
2) 创建会话和事实库。
3) 调用规则引擎执行规则并输出结果。
DecisionTableTest—Sample.xls的测试代码。
7 规则语言
在我们生成的HelloWorld里我们可以有2个文件Sample.drl和Sample.xls,这2个文件都是用来定义规则库的,Sample.xls我就不介绍了,用excel打开可以看到注释。
对于Sample.drl文件,Drools定义了一套自己的语言来描述规则。
格式为:
Rule 规则名
When 相当于IF,使用java bean里面的属性进行条件判断。
Then 满足条件后执行一定的操作,在这里返回结果或者更新状态信息。
End
本文做入门介绍,需要更深入了解可以看Drools的在线文档。
|