变量库文件

在业务系统开发过程中,会用到大量包含Getter和Setter方法的简单的Java对象,它们被称之为POJO(Plain Ordinary Java Object),或BOM\(Business Object Model\)对象,这些对象在开发中作为数据的载体,负责数据的传递。在URule Pro当中,变量库就是用来映射这些POJO对象,从而使得我们可以在具体的规则文件中使用它们,从而完成规则与业务数据的交互。

进入URule Pro规则设计页,在“库”节点点击右键,在弹出的菜单中选择“添加变量库”就可以创建变量库文件,如下图所示:

创建好变量库文件后,可以看到系统会用变量库编辑器自动打开这个文件。在这个编辑器中,首先需要添加变量的分类,然后再添加具体的变量字段。对应到Java实体对象,就是要添加对应的实体对象信息,再添加这个实体对象所拥有的属性信息。如下图所示:

添加一个分类,输入名称,这个名称是对当前分类的描述,会在规则中直接引用显示,所以一般我们会使用中文描述来作为名称,类路径,就是这个分类对应的实体类的完整路径,比如上图中的“com.bstek.entity.Customer”。

无论是变量分类还是具体的变量,都有一个“用途”的属性,可选值有三个,分别是:In、Out、InOut,含义如下表所示:
名称 描述
In 表示该变量只能用于输入、不能用于输出,在规则中可以用于条件判断,但不能给这个变量赋值,同时在快速测试中,不能选择用于输出。
Out 表示该变量只能用于输出、不能用于输入,在规则中既可以用于条件判断,也可以给这个变量赋值,但在快速测试中,不能选择其用于输入,只能选择其作为输出。
InOut 表示该变量即可以作为输入、也可以作为输出。

变量的类路径是规则引擎在执行过程中查找对应对象的唯一标识,所以在定义时一定要让其与实际业务中对应的POJO对象的完整类路径一致,否则在运行时将会出现找不到类的情况,或者使得规则在计算时不会出现我们期望的结果。

变量类路径也可以理解为一个变量的ID,实际使用时,这个类路径对应的类可以是不存在的,这样在代码中我们可以使用GeneralEntity来模拟这个类对象。在引擎提供的快速测试以及Rest调用中,所有的变量对象都是通过GeneralEntity模拟运行。

参数”是系统的保留字,专门用于“参数库”文件使用,因此在变量分类名称定义时,不能使用“参数”。

这时,变量的分类就定义好了,如果当前定义的类路径对应的类在当前应用中存在的话,那么可以在当前变量分类所在行点击右键,在弹出的菜单中选择“根据类路径生成字段”,系统就会通过Java的反射功能生成当前类对应的所有字段信息。上图中com.bstek.entity.Customer类源码如下所示:
package com.bstek.entity;
import java.util.Date;
import com.bstek.urule.model.Label;
/**
 * @author Jacky.gao
 * @since 2016年9月29日
 */
public class Customer {
    @Label("名称")
    private String name;
    @Label("年龄")
    private int age;
    @Label("出生日期")
    private Date birthday;
    @Label("等级")
    private int level;
    @Label("手机号")
    private String mobile;
    @Label("性别")
    private boolean gender;
    @Label("是否有车")
    private boolean car;
    @Label("婚否")
    private boolean married;
    @Label("是否有房")
    private boolean house;
    //省略上述所有属性对应的getter与setter方法......
}

在这个类当中,可以看到每个属性都有一个名为Label的annotation,它是一个由URule Pro提供的用来描述字段属性的annotation,这里描述的值,在生成变量时会自动写到变量的“标题”当中,这里的标题将会在规则中直接引用,让标题有意义,对于规则的清晰表达很有价值。

如果这个类在当前所在的项目当中,所以可以直接通过反射生成所有的属性,生成后的效果如下:

可以看到上图中**Label**这个annotation对应的描述写入到变量的“标题”当中。

这到里,变量库文件就定义好了,可以根据需要在一个文件中添加多个变量 分类,相应对应到多个POJO类。

变量字段默认值

字段默认值,默认为空。如果字段设置默认值,当调用规则时,用到当前字段,发现为空时将会使用默认值。

这样就省去了以前需要判断字段是否有值的条件判断。如不需要默认值,保持原样不设置默认值即可。

默认值功能在调用规则传入变量、变量类型的参数 、规则中动态生成实例时,均有效。

但如果用Java API调用规则,参数是变量类型,传入前需要调用 Utils.assignVariableObjectDefaultValue(参数,session);再触发执行规则。

参考如下代码:

        //从Spring中获取KnowledgeService接口实例
        KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
        //通过KnowledgeService接口获取指定的知识包ID"213"
        KnowledgePackage knowledgePackage=service.getKnowledge("213");
        //通过取到的KnowledgePackage对象创建KnowledgeSession对象
        KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);

        GeneralEntity employee=new GeneralEntity("rete.test.Employee");
        employee.put("id","0001");
        employee.put("name","马克");
        employee.put("salary",111000);
        //根据变量库设置的默认值设置变量实例
        Utils.assignVariableObjectDefaultValue(employee,session);

        Map<String,Object> parameter=new HashMap<String,Object>();
        parameter.put("currentEmployee", employee);

        //开始规则流并设置参数
        session.startProcess("flow-test",parameter);

results matching ""

    No results matching ""