单次触发决策集

​ 下面的代码中演示了单次调用知识包完整的调用过程:

package tt;
import rete.test.Dept;
import rete.test.Employee;
import com.bstek.urule.Utils;
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);

        Employee employee=new Employee();
        Dept dept=new Dept();
        dept.setLevel(12);
        employee.setDept(dept);
        employee.setSalary(111000);
        //将业务数据对象Employee插入到KnowledgeSession中
        session.insert(employee);
        //执行所有满足条件的规则
        session.fireRules();
    }
}

​ 在上面的示例当中,获取到KnowledgeSession对象后,向其中插入一个名为Employee业务数据对象,这样引擎在计算时,会直接采用Employee中相关数据,如有条件满足,同时有对Employee中相关数据赋值,那么会直接反映到当前插入的这个Employee对象当中。

​ 在实际使用中,可能还会向KnowledgeSession中添加参数数据(以Map形式添加),对应URule中的参数库文件中定义的信息,引擎计算完成后,我们要通KnowledgeSession中的getParameter来获取具体的参数对象,而不 能通过原添加的Map中获取,如下代码:

package tt;
import java.util.HashMap;
import java.util.Map;
import rete.test.Dept;
import rete.test.Employee;
import com.bstek.urule.Utils;
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"test123"
        KnowledgePackage knowledgePackage=service.getKnowledge("213");
        //通过取到的KnowledgePackage对象创建KnowledgeSession对象
        KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);

        Employee employee=new Employee();
        Dept dept=new Dept();
        dept.setLevel(12);
        employee.setDept(dept);
        employee.setSalary(111000);
        //将业务数据对象Employee插入到KnowledgeSession中
        session.insert(employee);
        //执行所有满足条件的规则

        Map<String,Object> parameter=new HashMap<String,Object>();
        parameter.put("count", 10);
        parameter.put("result", true);
        //触发规则时并设置参数
        session.fireRules(parameter);

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

​ 从上面的代码中可以看到,在规则计算完成后,在获取计算后的参数中的result值时,我们并没有用提供参数的parameter,而是通过KnowledgeSession的getParameter来实现,这是因为在向KnowledgeSession设置参数时,引擎会将参数中所有的值取出并放入到引擎中内置的一个Map中,以避免影响原参数的值。所以计算完成后,我们要通过KnowledgeSession的getParameter来获取计算后的参数值。

触发决策流

​ 如果我们的资源包中包含有规则流,那么在插入好相关业务数据对象后,可以通过KnowledgeSession中提供的startProcess来实现规则流的调用,如下面的代码所示:

package tt;
import java.util.HashMap;
import java.util.Map;
import rete.test.Dept;
import rete.test.Employee;
import com.bstek.urule.Utils;
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);

        Employee employee=new Employee();
        Dept dept=new Dept();
        dept.setLevel(12);
        employee.setDept(dept);
        employee.setSalary(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);
    }
}

​ 在URule Pro当中,规则流中是不存在人工任务的,也就是说规则流的执行是一次性完成的,这点与包含人工任务的工作流引擎不同,比如UFLO,在UFLO中有人工任务,所以开启流程实例后可能需要多次完成人工任务才能完成一个流程实例。

注意:通过API调用知识包时,需要指定知识包的ID,这个ID就是定义知识包时系统生成的数字ID,这点与3.x及以往版本不同,需要我们特别注意。

results matching ""

    No results matching ""