转自http://www.cnblogs.com/soul-tap/p/4956052.html
IBM规则引擎(ODM)入门系列一(1):如何编写规则项目
最近,因项目需要,研究使用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对象:
1 2 3 4 5 6 7 8 9 | public class Person{ //年龄 private int age; //性别 private String sex; //信息 private String msg; //getter and setter<br>} |
两个概念
在开始创建规则项目之前,还需要明确两个概念:
XOM:执行对象模型,就是规则引擎执行规则过程中所使用的对象,可以是java bean对象,如上文的 Person,也可以是XML
BOM:业务对象模型,其实就是XOM的一个映射,将XOM中的程序描述语言映射成业务描述语言,如:将age属性映射成年龄,将sex属性映射成性别,主要是用来方便业务人员(非IT)维护规则。
开发规则
明白了业务场景和理解了以上的两个概念,我们就可以开始开发规则项目了
打开Rule Designer编辑器,首先我们需要创建一个普通的java项目,该项目中只包含XOM对象
在编辑器的“规则资源管理器”内鼠标右键》新建》项目》java项目,输入名称:Person-xom,点击完成。
在person-xom项目中创建Person.java类(即上文给出的Person java bean)
创建一个规则项目
在编辑器的“规则资源管理器”内鼠标右键》新建》项目》规则项目
点击“下一步”,
输入项目名称:PersonRule,点击“下一步”,
没有其他规则项目需要引用,点击“下一步”,
XOM设置中,选择创建的Person-xom项目,点击“下一步”,
没有动态XOM,直接点击“完成”。
此时,我们的规则项目已经创建好了,整体的项目结构如下:
鼠标点击一下规则项目,编辑器会显示“规则项目图”视窗:
如果没有显示这个视图,可以通过如下操作打开此视窗:窗口》显示视图》规则项目图,这个视图类似一个规则项目的导航,显示着当前规则项目已经具备了哪些结构,还有哪些结构需要完善,其中,蓝色的导航是可以操作的结构,如:导入XOM,创建BOM等,因为我们在创建规则项目的时候已经将Person-xom导入进项目,所以,视图中“导入XOM”导航条目后面会跟一个(1),当然,如果需要,可以点此条目导航继续添加XOM;还有另一部分导航条目是灰色的,这是因为要设置这些条目内容是需要前置条件的,如:“定义参数”导航条目需要“创建BOM”之后才可用,了解了这些,就可以根据整个视图的导航来一步步完成我们规则项目内容的创建了,在此多说一句,以上导航条目都可以在项目上右键鼠标找到,但是建议使用“规则项目图”,可以更方便和更直观的对整个规则项目进行把控。
点击“创建BOM”导航
输入名称:person,勾选“从XOM创建BOM条目”,点击“下一步”,
点击“浏览XOM”按钮,
选择person-xom,点击“确定”,
勾选Person类,点击“下一步”,
将“所有方法”勾选,点击“完成”按钮。
到此处,我们便完成了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,语言描述设置为:人员,点击类型中的导入按钮,进行类型选择:
输入关键字模糊查询,选择Person类型,点击“确定”按钮:
点击“确定”,完成参数定义,如果需要定义多个参数,按照此步骤添加即可。
回到“规则项目图”,点击“添加规则包”导航条目,添加规则包过程与我们创建正常的java package一样,需要注意路径,要将规则包放在规则项目的“规则”这个包的下面,这里不再逐步介绍,需要创建的规则包名如下:
1、checkAge
2、checkSex
创建规则包之后的项目结构如下图:
继续回到“规则项目图”视图,此时我们可以选择的操作有很多,我们选择“添加操作规则”导航条目进行点击,
在这个窗口中,包选择checkAge包,名称输入:年龄检查,点击“完成”。
以相同的方式在checkSex包下创建 性别检查 操作规则,创建完成之后的项目结构如下:
接下来,开始编辑规则,双击“年龄检查”操作规则,打开操作规则编辑视窗,
此时,确定光标在“内容”模块内,使用快捷键“Ctrl+Shift+空格”弹出词汇表,选择 如果<条件>
选择之后,显示如下:
其中<条件>相当于一个替代符,点击这个替代符,可以选择相应的词汇,如图
这个人员就是我们在 设置参数 操作中设置的参数,因为我们要对人员信息进行规则检查,所以这里选择 “人员”,
选择“人员”之后编辑器会自动带出人员相关的操作词汇,如上图,因为这条规则是对人员的年龄进行检查,所以这里选择“的年龄”,
同理,选择“年龄”之后编辑器会提示下一步的操作预选项,还记的业务中的规则条件吗? 人员 年龄 小于 18 岁,不检查性别并设置人员信息为“未成年人”,在这里,我们选择 小于<一个数字>,
然后将<数字>占位符换成18,此时规则条件便设置完成了,
接下来,继续使用快捷键“Ctrl+Shift+空格”,选择 那么<操作>,
点击操作,
根据业务需求,选择“设置<一个人员>的当前信息为<一个字符长>”,
之后,点击<一个人员>将占位符换成“人员”,将<一个字符串>换成"未成年人"
注意,操作结尾要跟“;”号,但条件中不用“;”号。
这样,我们年龄检查的操作规则就编辑好了,是不是很简单?到此处,我想朋友们对为什么映射BOM各属性到词汇表也有了一个更清晰的认识了,这样使用起来的确很方便,而对于非IT人员来说,也大大减低了培训成本。
接下来,以同样的方式将另一条操作规则编写完成,性别检查的原始需求如下:
人员的年龄>=18岁,检查人员性别,设置人员信息为“成年女/男性”;
编辑完成的性别检查操作规则如下图:
这里有朋友可能会问了,年龄大于18是是否进行性别检查的先导条件?为何在性别检查的规则中没有年龄检查?这便引起了我们下一个要完善的工作,添加规则流,在这个过程中你会明白,规则流会帮我们控制规则的执行流向。
添加规则流操作之前,我先介绍一下什么是规则流,从字面意义上来理解,规则流就是控制规则流向的一个组件,每一个规则项目中必须包含一个规则集,规则集中包含着至少一条的操作规则和规则流,操作规则排布在规则流上,规则集按照规则流流向执行规则,有点绕,大家可以理解一下。
接下来,添加规则流,同样回到“规则集视图”,点击“添加规则流”导航条目,
包名不用填写,创建在“规则”包下即可,名称填写:PersonCheck,点击完成,添加之后的规则项目结构图如下:
双击规则流,打开规则流编辑器,
做过工作流的朋友有可能会感到熟悉,规则流的编辑类似工作流的编辑,编辑器左边的一列按钮大家可以将鼠标放在上面查看分别代表什么含义,编辑器支持拖拽,我们先创建一个开始和结束按钮,
接下来,需要将操作规则拖拽进编辑器,
使用链接线将各部分进行链接,同时,在这个过程中控制规则流向要符合业务,
现在,解析一下我设置的规则流程,如图,规则从开始执行,先执行了 “年龄检查”操作规则,之后从年龄检查规则流出,这时候有两条流向1和2,它们是互斥关系,我将1那条线路设置如下条件“如果,人员年龄小于18岁”,如果符合此条件,规则就按此条线路走,结束规则,这样就避免了性别检查,反之,会进行性别检查,之后结束,图中可以看到有错误提示,设置完线路的判断条件即可关闭错误提示,点击1那条线路,查看“属性”视窗(如为打开此视窗,请窗口》显示视图》属性,打开),
标签输入:年龄判断,勾选“将BAL用于转换条件”,将光标焦点定位在下面空白处,使用快捷键导出词汇表,完成如下图条件设置,
点击保存,此时,规则流视图中不再出现错误提示,并显示设置的条件标签,整个规则流如下图,
至此,我们便完成了整个规则项目的创建工作。
因为,篇幅原因,这一片就写到这里,我会在下一篇中详细说明如何来对规则项目进行测试。关于规则项目中的其他的所有知识点,也会在后续的章节中一点一点详细介绍出来,如果,您有任何疑问或者问题,都可以给我留言或评论,我会在第一时间回复您。
写博客真的不易,如果您感觉这片博客对您有帮助,欢迎转载,但请您务必注明出处,感谢!!!