單次觸發決策集

​ 下面的代碼中(zhōng)演示了單次調用(yòng)知識包完整的調用(yòng)過程:

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中(zhōng)獲取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);
        //将業務(wù)數據對象Employee插入到KnowledgeSession中(zhōng)
        session.insert(employee);
        //執行所有(yǒu)滿足條件的規則
        session.fireRules();
    }
}

​ 在上面的示例當中(zhōng),獲取到KnowledgeSession對象後,向其中(zhōng)插入一個名(míng)為(wèi)Employee業務(wù)數據對象,這樣引擎在計算時,會直接采用(yòng)Employee中(zhōng)相關數據,如有(yǒu)條件滿足,同時有(yǒu)對Employee中(zhōng)相關數據賦值,那麽會直接反映到當前插入的這個Employee對象當中(zhōng)。

​ 在實際使用(yòng)中(zhōng),可(kě)能(néng)還會向KnowledgeSession中(zhōng)添加參數數據(以Map形式添加),對應URule中(zhōng)的參數庫文(wén)件中(zhōng)定義的信息,引擎計算完成後,我們要通KnowledgeSession中(zhōng)的getParameter來獲取具(jù)體(tǐ)的參數對象,而不 能(néng)通過原添加的Map中(zhōng)獲取,如下代碼:

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中(zhōng)獲取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);
        //将業務(wù)數據對象Employee插入到KnowledgeSession中(zhōng)
        session.insert(employee);
        //執行所有(yǒu)滿足條件的規則

        Map<String,Object> parameter=new HashMap<String,Object>();
        parameter.put("count", 10);
        parameter.put("result", true);
        //觸發規則時并設置參數
        session.fireRules(parameter);

        //獲取計算後的result值,要通過KnowledgeSession,而不能(néng)通過原來的parameter對象
        boolean result=(Boolean)session.getParameter("result");
        System.out.println(result);
    }
}

​ 從上面的代碼中(zhōng)可(kě)以看到,在規則計算完成後,在獲取計算後的參數中(zhōng)的result值時,我們并沒有(yǒu)用(yòng)提供參數的parameter,而是通過KnowledgeSession的getParameter來實現,這是因為(wèi)在向KnowledgeSession設置參數時,引擎會将參數中(zhōng)所有(yǒu)的值取出并放入到引擎中(zhōng)内置的一個Map中(zhōng),以避免影響原參數的值。所以計算完成後,我們要通過KnowledgeSession的getParameter來獲取計算後的參數值。

觸發決策流

​ 如果我們的資源包中(zhōng)包含有(yǒu)規則流,那麽在插入好相關業務(wù)數據對象後,可(kě)以通過KnowledgeSession中(zhōng)提供的startProcess來實現規則流的調用(yòng),如下面的代碼所示:

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中(zhōng)獲取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);
        //将業務(wù)數據對象Employee插入到KnowledgeSession中(zhōng)
        session.insert(employee);
        //執行所有(yǒu)滿足條件的規則

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

        //開始規則流并設置參數
        session.startProcess("flow-test",parameter);

        //獲取計算後的result值,要通過KnowledgeSession,而不能(néng)通過原來的parameter對象
        boolean result=(Boolean)session.getParameter("result");
        System.out.println(result);
    }
}

​ 在URule Pro當中(zhōng),規則流中(zhōng)是不存在人工(gōng)任務(wù)的,也就是說規則流的執行是一次性完成的,這點與包含人工(gōng)任務(wù)的工(gōng)作(zuò)流引擎不同,比如UFLO,在UFLO中(zhōng)有(yǒu)人工(gōng)任務(wù),所以開啓流程實例後可(kě)能(néng)需要多(duō)次完成人工(gōng)任務(wù)才能(néng)完成一個流程實例。

注意:通過API調用(yòng)知識包時,需要指定知識包的ID,這個ID就是定義知識包時系統生成的數字ID,這點與3.x及以往版本不同,需要我們特别注意。

results matching ""

    No results matching ""