使用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实现业务数据的传递。