你的位置:首页 > Java教程

[Java教程]IBM规则引擎(ODM)入门系列一:如何编写规则项目


最近,因项目需要,研究使用IBM的规则引擎,但是网上相关资料甚少,只能查看IBM官网的相关文档,但大多是英文,所以学习过程相当痛苦,好在有IBM的技术支持人员帮助,在此,决定将自己对ODM的学习过程做成一个入门系列,巩固一下自己,同时惠及他人。

ODM简介

ODM:Operational Decision Manager,直接翻译的话就是“决策管理系统”,什么是决策?决策就是业务人员或决策人员制定的业务规则,而ODM就是管理这些业务规则的一套系统。举个简单例子来说:一个店铺,双十一期间打折,根据用户的等级给出的折扣是不一样的,如:普通用户享受9折优惠,白金用户享受8折优惠,钻石用户享受7折优惠,这就是“业务规则”,这样的业务场景在我们身边比比皆是,一般我们的做法是在代码中做一系列if...else判断,更好一些的做法是将规则条件转换成配置文件,实现与代码的低耦合,但是,一旦发生了规则的添加那么代码就一定得作出修改。当然,这紧紧是列举了一个相当简单的业务场景,面对那些复杂的业务场景涉及成千上万的规则判断时候,那在应用代码中维护,就是一项十分恐怖的工作。ODM就是一套管理这些业务规则并且独立于应用系统之外的一个产品,它包含了很多组件可以帮助IT或非IT之外的人员实现决策的定制、维护和监控工作,帮助决策人员作出更好的决策,大大降低复杂业务规则维护带来的巨大工作量,它支持对外提供web服务,满足SOA架构需求。

ODM相关组件介绍

 这里介绍一些主要的组件:

1、Rule Designer:这是创建规则项目、打包、发布规则的一个编辑器,本身是一个eclipse插件,会使用eclipse便可以很轻松掌握这款编辑器的使用。

2、Rule TeamServer:也叫决策中心,简称rts,在编辑器(Rule Designer)中编辑好的规则项目可以同步到rts,业务人员和it人员可以在这个环境上进行规则集的调试,规则流结构的调整,以及向规则集中编辑添加新规则,支持业务人员以导入excel的形式导入新规则等等。

3、Rule Execution Server:规则执行环境,简称res,有人说他是规则引擎的核心,在编辑器中编辑好的规则,打包部署到res环境上,规则集便可以进行执行,该服务支持将规则发布成webservice,以供客户端调用,res同时支持规则的完成性检查,可以对规则调用的次数及效率进行监控,支持生成excel文件类型的规则执行报告。

使用Rule Designer创建规则项目

上面介绍了ODM的主要组件,接下来,开始我们本篇博客的主要内容部分:使用Rule Designer编辑器创建规则项目,至于rts及res,会在本系列之后的博文中再做详细讲解。

业务场景

设置一个简单的业务场景:

人员信息检查:

1、人员的年龄<18岁,不检查人员性别,设置人员信息为“未成年人”;

2、人员的年龄>=18岁,检查人员性别,设置人员信息为“成年女/男性”;

从业务场景中我们简单提炼出一个人员的java bean对象:

public class Person{  //年龄  private int age;  //性别  private String sex;  //信息  private String msg;      //getter and setter
}

 两个概念

 在开始创建规则项目之前,还需要明确两个概念:

XOM:执行对象模型,就是规则引擎执行规则过程中所使用的对象,可以是java bean对象,如上文的 Person,也可以是

BOM:业务对象模型,其实就是XOM的一个映射,将XOM中的程序描述语言映射成业务描述语言,如:将age属性映射成年龄,将sex属性映射成性别,主要是用来方便业务人员(非IT)维护规则。

开发规则

 明白了业务场景和理解了以上的两个概念,我们就可以开始开发规则项目了

打开Rule Designer编辑器,首先我们需要创建一个普通的java项目,该项目中只包含XOM对象

在编辑器的“规则资源管理器”内鼠标右键》新建》项目》java项目,输入名称:Person-xom,点击完成。

在person-xom项目中创建Person.java类(即上文给出的Person java bean)

创建一个规则项目

在编辑器的“规则资源管理器”内鼠标右键》新建》项目》规则项目

输入项目名称:PersonRule,点击“下一步”,

没有其他规则项目需要引用,点击“下一步”,

没有动态XOM,直接点击“完成”。

此时,我们的规则项目已经创建好了,整体的项目结构如下:

鼠标点击一下规则项目,编辑器会显示“规则项目图”视窗:

输入名称:person,勾选“从XOM创建BOM条目”,点击“下一步”,

选择person-xom,点击“确定”,

将“所有方法”勾选,点击“完成”按钮。

到此处,我们便完成了BOM的创建,此时,查看“规则项目图”视图中的“创建BOM”导航条目后面也会出现一个(1),说明,我们创建BOM成功。

如上图,因为我们创建了BOM,所以“定义参数”导航条目也变成可用的了,但是,先不急定义参数,BOM创建完成之后,还需要对其进行编辑,将它的各个属性映射成业务相关语言,生成编辑规则时可用的词汇表。(这一步不是必须需要,如果你能保证以后规则的维护都是IT人员,那么不用做此不操作,如果保证不了,还是需要完成此不操作,这样有助于非IT人员对规则的编辑和维护,这也是ODM的强大之处)

创建完成BOM之后,规则项目目录结构如下:

在规则项目中,双击创建的BOM(Person类),打开BOM信息展示视图

将术语中的“person”修改为“人员”,并进行保存,这样便完成了类名从person到人员的映射设置。

在规则项目中双击BOM对象的age属性,

打开此属性信息视图,

细心的朋友可能注意到了,通过切换视图下面的tab页也可以切换各个视图。在这个视图中,点击“编辑短语中使用的主题”,

将age修改为 年龄,点击 确定,

此时,在导航和操作中的语言已经将age转换成了 年龄,我们还需将 操作 中的 age修改为 年龄,

点击保存(Ctrl+S)。

然后按照以上过程将所有属性进行映射设置:

info:信息;

sex:性别;

完成了如上设置,我们可以查看“词汇表”,来查看刚才我们设置的词汇:

如果没有词汇表视图,可以通过:窗口》显示视图》词汇表,来打开。

至此,我们完成了BOM的创建及词汇表的映射操作。

让我们回到“规则项目图”,点击“定义参数”导航条目,

进行参数相关属性设置,参数名输入person,方向选在IN_OUT,语言描述设置为:人员,点击类型中的导入按钮,进行类型选择:

点击“确定”,完成参数定义,如果需要定义多个参数,按照此步骤添加即可。

回到“规则项目图”,点击“添加规则包”导航条目,添加规则包过程与我们创建正常的java package一样,需要注意路径,要将规则包放在规则项目的“规则”这个包的下面,这里不再逐步介绍,需要创建的规则包名如下:

1、checkAge

2、checkSex

创建规则包之后的项目结构如下图:

继续回到“规则项目图”视图,此时我们可以选择的操作有很多,我们选择“添加操作规则”导航条目进行点击,

接下来,开始编辑规则,双击“年龄检查”操作规则,打开操作规则编辑视窗,

此时,确定光标在“内容”模块内,使用快捷键“Ctrl+Shift+空格”弹出词汇表,选择 如果<条件>

选择之后,显示如下:

其中<条件>相当于一个替代符,点击这个替代符,可以选择相应的词汇,如图

选择“人员”之后编辑器会自动带出人员相关的操作词汇,如上图,因为这条规则是对人员的年龄进行检查,所以这里选择“的年龄”,

接下来,继续使用快捷键“Ctrl+Shift+空格”,选择 那么<操作>,

点击操作,

根据业务需求,选择“设置<一个人员>的当前信息为<一个字符长>”,

之后,点击<一个人员>将占位符换成“人员”,将<一个字符串>换成"未成年人"

注意,操作结尾要跟“;”号,但条件中不用“;”号。

这样,我们年龄检查的操作规则就编辑好了,是不是很简单?到此处,我想朋友们对为什么映射BOM各属性到词汇表也有了一个更清晰的认识了,这样使用起来的确很方便,而对于非IT人员来说,也大大减低了培训成本。

接下来,以同样的方式将另一条操作规则编写完成,性别检查的原始需求如下:

人员的年龄>=18岁,检查人员性别,设置人员信息为“成年女/男性”;

编辑完成的性别检查操作规则如下图:

这里有朋友可能会问了,年龄大于18是是否进行性别检查的先导条件?为何在性别检查的规则中没有年龄检查?这便引起了我们下一个要完善的工作,添加规则流,在这个过程中你会明白,规则流会帮我们控制规则的执行流向。

添加规则流操作之前,我先介绍一下什么是规则流,从字面意义上来理解,规则流就是控制规则流向的一个组件,每一个规则项目中必须包含一个规则集,规则集中包含着至少一条的操作规则和规则流,操作规则排布在规则流上,规则集按照规则流流向执行规则,有点绕,大家可以理解一下。

接下来,添加规则流,同样回到“规则集视图”,点击“添加规则流”导航条目,