使用的工具: Rule Designer(用来开发ilog的一个eclipse插件)
1.创建普通的java项目:
打开Rule Designer编辑器,首先我们需要创建一个普通的java项目,该项目中只包含XOM对象
在编辑器的“规则资源管理器”内鼠标右键》新建》项目》java项目,输入名称:Person-xom,点击完成。
在person-xom项目中创建Person.java类(即上文给出的Person java bean)
代码:
package bom;
public class Person {
private int age;
private String sex;
private String msg;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
2.创建一个规则项目:
(1).新建规则项目
在编辑器的“规则资源管理器”内鼠标右键》新建》项目》规则项目
点击“下一步”
输入项目名称:PersonRule,点击“下一步”,
没有其他规则项目需要引用,点击“下一步”,
XOM设置中,选择创建的Person-xom项目,点击“下一步”,
没有动态XOM,直接点击“完成”。
此时,我们的规则项目已经创建好了,整体的项目结构如下:
鼠标点击一下规则项目,编辑器会显示“规则项目图”视窗:
如果没有显示这个视图,可以通过如下操作打开此视窗:窗口》显示视图》规则项目图,这个视图类似一个规则项目的导航,显示着当前规则项目已经具备了哪些结构,还有哪些结构需要完善,其中,蓝色的导航是可以操作的结构,如:导入XOM,创建BOM等,因为我们在创建规则项目的时候已经将Person-xom导入进项目,所以,视图中“导入XOM”导航条目后面会跟一个(1),当然,如果需要,可以点此条目导航继续添加XOM;还有另一部分导航条目是灰色的,这是因为要设置这些条目内容是需要前置条件的,如:“定义参数”导航条目需要“创建BOM”之后才可用,了解了这些,就可以根据整个视图的导航来一步步完成我们规则项目内容的创建了,在此多说一句,以上导航条目都可以在项目上右键鼠标找到,但是建议使用“规则项目图”,可以更方便和更直观的对整个规则项目进行把控。
(2).创建bom
点击“创建BOM”导航
输入名称:person,勾选“从XOM创建BOM条目”,点击“下一步”,
点击“浏览XOM”按钮,
选择person-xom,点击“确定”,
勾选Person类,点击“下一步”,
将“所有方法”勾选,点击“完成”按钮。
到此处,我们便完成了BOM的创建,此时,查看“规则项目图”视图中的“创建BOM”导航条目后面也会出现一个(1),说明,我们创建BOM成功。
如上图,因为我们创建了BOM,所以“定义参数”导航条目也变成可用的了,但是,先不急定义参数,BOM创建完成之后,还需要对其进行编辑,将它的各个属性映射成业务相关语言,生成编辑规则时可用的词汇表。(这一步不是必须需要,如果你能保证以后规则的维护都是IT人员,那么不用做此不操作,如果保证不了,还是需要完成此不操作,这样有助于非IT人员对规则的编辑和维护,这也是ODM的强大之处)
(3).词汇表映射
创建完成BOM之后,规则项目目录结构如下:
在规则项目中,双击创建的BOM(Person类),打开BOM信息展示视图
在这个视图的右上“类语言描述部分”中有一个“术语”条目
将术语中的“person”修改为“人员”,并进行保存,这样便完成了类名从person到人员的映射设置。
在规则项目中双击BOM对象的age属性,
打开此属性信息视图,
细心的朋友可能注意到了,通过切换视图下面的tab页也可以切换各个视图。在这个视图中,点击“编辑短语中使用的主题”,
将age修改为 年龄,点击 确定,
此时,在导航和操作中的语言已经将age转换成了 年龄,我们还需将 操作 中的 age修改为 年龄,
点击保存(Ctrl+S)。
然后按照以上过程将所有属性进行映射设置:
info:信息;
sex:性别;
完成了如上设置,我们可以查看“词汇表”,来查看刚才我们设置的词汇:
如果没有词汇表视图,可以通过:窗口》显示视图》词汇表,来打开。
至此,我们完成了BOM的创建及词汇表的映射操作。
(4).定义参数
让我们回到“规则项目图”,点击“定义参数”导航条目,
点击“添加”按钮,添加一个参数,
进行参数相关属性设置,参数名输入person,方向选在IN_OUT,语言描述设置为:人员,点击类型中的导入按钮,
进行类型选择:
输入关键字模糊查询,选择Person类型,点击“确定”按钮:
点击“确定”,完成参数定义,如果需要定义多个参数,按照此步骤添加即可。
(5).创建规则
回到“规则项目图”,点击“添加规则包”导航条目,添加规则包过程与我们创建正常的java package一样,需要注意路径,要将规则包放在规则项目的“规则”这个包的下面,这里不再逐步介绍,需要创建的规则包名如下:
1、checkAge
2、checkSex
创建规则包之后的项目结构如下图:
继续回到“规则项目图”视图,此时我们可以选择的操作有很多,我们选择“添加操作规则”导航条目进行点击,
在这个窗口中,包选择checkAge包,名称输入:年龄检查,点击“完成”。
以相同的方式在checkSex包下创建 性别检查 操作规则,创建完成之后的项目结构如下:
(6).编辑规则
接下来,开始编辑规则,双击“年龄检查”操作规则,打开操作规则编辑视窗,
此时,确定光标在“内容”模块内,使用快捷键“Ctrl+Shift+空格”弹出词汇表,选择 如果<条件>
选择之后,显示如下:
其中<条件>相当于一个替代符,点击这个替代符,可以选择相应的词汇,如图
这个人员就是我们在 设置参数 操作中设置的参数,因为我们要对人员信息进行规则检查,所以这里选择 “人员”,
选择“人员”之后编辑器会自动带出人员相关的操作词汇,如上图,因为这条规则是对人员的年龄进行检查,所以这里选择“的年龄”,
同理,选择“年龄”之后编辑器会提示下一步的操作预选项,还记的业务中的规则条件吗? 人员 年龄 小于 18 岁,不检查性别并设置人员信息为“未成年人”,在这里,我们选择 小于<一个数字>,
然后将<数字>占位符换成18,此时规则条件便设置完成了,
接下来,继续使用快捷键“Ctrl+Shift+空格”,选择 那么<操作>,
点击操作,
根据业务需求,选择“设置<一个人员>的当前信息为<一个字符长>”,
之后,点击<一个人员>将占位符换成“人员”,将<一个字符串>换成"未成年人"
注意,操作结尾要跟“;”号,但条件中不用“;”号。
这样,我们年龄检查的操作规则就编辑好了,是不是很简单?到此处,我想朋友们对为什么映射BOM各属性到词汇表也有了一个更清晰的认识了,这样使用起来的确很方便,而对于非IT人员来说,也大大减低了培训成本。
接下来,以同样的方式将另一条操作规则编写完成,性别检查的原始需求如下:
人员的年龄>=18岁,检查人员性别,设置人员信息为“成年女/男性”;
编辑完成的性别检查操作规则如下图:
这里有朋友可能会问了,年龄大于18是是否进行性别检查的先导条件?为何在性别检查的规则中没有年龄检查?这便引起了我们下一个要完善的工作,添加规则流,在这个过程中你会明白,规则流会帮我们控制规则的执行流向。
(7).创建规则流
添加规则流操作之前,我先介绍一下什么是规则流,从字面意义上来理解,规则流就是控制规则流向的一个组件,每一个规则项目中必须包含一个规则集,规则集中包含着至少一条的操作规则和规则流,操作规则排布在规则流上,规则集按照规则流流向执行规则,有点绕,大家可以理解一下。
接下来,添加规则流,同样回到“规则集视图”,点击“添加规则流”导航条目,
包名不用填写,创建在“规则”包下即可,名称填写:PersonCheck,点击完成,添加之后的规则项目结构图如下:
双击规则流,打开规则流编辑器,
做过工作流的朋友有可能会感到熟悉,规则流的编辑类似工作流的编辑,编辑器左边的一列按钮大家可以将鼠标放在上面查看分别代表什么含义,编辑器支持拖拽,我们先创建一个开始和结束按钮,
接下来,需要将操作规则拖拽进编辑器,
使用链接线将各部分进行链接,同时,在这个过程中控制规则流向要符合业务,
现在,解析一下我设置的规则流程,如图,规则从开始执行,先执行了 “年龄检查”操作规则,之后从年龄检查规则流出,这时候有两条流向1和2,它们是互斥关系,我将1那条线路设置如下条件“如果,人员年龄小于18岁”,如果符合此条件,规则就按此条线路走,结束规则,这样就避免了性别检查,反之,会进行性别检查,之后结束,图中可以看到有错误提示,设置完线路的判断条件即可关闭错误提示,点击1那条线路,查看“属性”视窗(如为打开此视窗,请窗口》显示视图》属性,打开),
标签输入:年龄判断,勾选“将BAL用于转换条件”,将光标焦点定位在下面空白处,使用快捷键导出词汇表,完成如下图条件设置,
点击保存,此时,规则流视图中不再出现错误提示,并显示设置的条件标签,整个规则流如下图,
至此,我们便完成了整个规则项目的创建工作。
(8).创建决策表
回顾一下我们性别检查的操作规则:
仔细观察一下上图的逻辑不难发现,以上规则遗漏了性别为空的情况(即将没有设置性别的人员默认设置为女性),这不符合所有的业务场景,有的朋友可能会说,再加一个判断就可以了:
再如果(else if) '人员'的性别 是 "female" 那么 设置'人员'的当前信息为"成年女性" ;否则(else) 设置'人员'的当前信息为"...",但是很遗憾,ODM不支持类似else if的判断,那怎么办?不用担心,我们用决策表来解决。
什么是决策表?大家只要记住,如果出现了类似需要多个if...else if....这样的判断逻辑的时候,您就应该考虑使用决策表了。
开始我们决策表的创建,点击规则项目"PersonRule",查看“规则项目图”,
点击“添加决策表”导航条目,
包选择“checkSex”,名称输入“性别检查决策表”,点击完成,此时,会自动打开新建的决策表编辑页面:
如图,默认的决策表有3列条件列,用来设置判断条件,一列操作列,用来定义对符合所有条件列的结果做出的操作,大家可以根据自己的实际业务需求在表头鼠标右键来删除或添加相应的列(类似Excel操作),在我的这个业务场景中,只是对性别进行判断,同时只是对人员的信息进行操作,所以,在这个决策表中,我只需要一个条件列和一个结果列,删除两个条件列之后如图,
双击条件列表头,
点击“<条件>”并配合快捷键“Ctrl+Shift+空格”调出词汇表,完成条件设置,将标题修改为“性别检查”,
点击“确定”,这样就完成条件列判断条件的设置,接下来设置值,分别为:"male","female","",
设置操作列操作,双击表头B,
使用词汇表编辑操作,将标题修改为“设置人员信息”,
点击“确认”按钮,完成操作语句的设置,
设置相应条件对应的操作,
保存
这个决策表还可以做如下优化,使其能处理所有情况:
将决策表加入到规则流中,双击打开规则流编辑视图,
将“性别检查”操作规则删除,并将“性别检查决策表”拖拽进来,使用链接线连接好,
其他结构不用改变,规则流定义好了。
三、规则项目应用发布到res
(1).新建规则应用
打开Rule Designer,查看一下我们的规则项目:
以PersonRule规则项目为例,如上图中,在“规则项目图”视图中,点击“创建RuleApp项目”:
输入项目名“PersonRuleApp”,点击下一步:
因为点击的是PersonRule规则集项目的“创建RuleApp”导航链接,所以这里选择规则集项目默认为“PersonRule”,点击完成。
此时在资源管理器中多了一个“PersonRuleApp”,它的目录机构下面有一个PersonRule10.jar,这个是我们的规则项目包,还有一个archive.xml,这个文件包含部署链接操作及RuleApp描述信息:
2.将规则项目应用部署到res
点击“部署”栏中的“将 RuleApp 部署到一个或多个 Rule Execution Server 实例”:
勾选“增量RuleApp主版本”,点击下一步:
这里选择“创建临时res配置”,然后填写res服务地址及用户名、密码,勾选“包好XOM”,点击完成。
这样,我们就将打好的RuleApp包部署到Res服务上了,现在登录res去看看吧:
登录进来之后,点击“资源管理器”列表,在这个列表下,可以看到所有已经部署的RuleApp,在右侧可以看到每一个RuleApp的版本号、创建日期、规则集数。