使用GeneralEntity传递值

​ 在代码中调用知识包,对于需要插入到规则中的变量对象,可能当前环境里并不存在,或者说这种变量的属性是动态可变的,对于这两种我们可以使用URule Pro中提供的GeneralEntity来代替实际的业务对象。

​ GeneralEntity扩展自HashMap,所以可以通过Map的put方法将目标对象的属性及其值在代码中逐个填入,同时GeneralEntity实例化时要求必须要提供一个String类型的构造参数,这个String类型的值表示的就是目标业务对象的完整类名。 ​ 通过使用GeneralEntity来代替实际业务对象,代码就是下面的样子:

package tt;
import java.util.HashMap;
import java.util.Map;
import com.bstek.urule.Utils;
import com.bstek.urule.model.GeneralEntity;
import com.bstek.urule.runtime.KnowledgePackage;
import com.bstek.urule.runtime.KnowledgeSession;
import com.bstek.urule.runtime.KnowledgeSessionFactory;
import com.bstek.urule.runtime.service.KnowledgeService;
/**
 * @author Jacky.gao
 * @since 2015年3月5日
 */
public class Invoke {
    public void doTest() throws Exception{
        //从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");
        GeneralEntity dept=new GeneralEntity("rete.test.Dept");
        dept.put("level",12);
        employee.put("dept",dept);
        employee.put("salary",111000);
        //将业务数据对象Employee插入到KnowledgeSession中
        session.insert(employee);
        //执行所有满足条件的规则

        Map<String,Object> parameter=new HashMap<String,Object>();
        parameter.put("count", 10);
        parameter.put("result", true);

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

        //获取计算后的result值,要通过KnowledgeSession,而不能通过原来的parameter对象
        boolean result=(Boolean)session.getParameter("result");
        System.out.println(result);
    }
}

​ 在上面的代码当中,我们就通过GeneralEntity来代替实际的Employee和Dept对象插入到规则当中,运行后我们发现其结果与实际的Employee和Dept对象插入到规则当中运行结果完全一致。

​ 实际上,在URule Pro提供的快速测试、Rest调用、基于Excel的批量测试实际在调用规则传递变量时采用的都是GeneralEntity来代替实际的业务对象, ​ 所以如果我们在代码中调用业务规则实际业务对象不存在时,也可以采用GeneralEntity实现业务数据的传递。

results matching ""

    No results matching ""