單次觸發決策集

​ 下面的代碼中演示了單次調用知識包完整的調用過程:

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);
        //通(tōng)過KnowledgeService接口獲取指定的知識包ID"213"
        KnowledgePackage knowledgePackage=service.getKnowledge("213");
        //通(tōng)過取到的KnowledgePackage對象創建KnowledgeSession對象
        KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);

        Employee employee=new Employee();
        Dept dept=new Dept();
        dept.setLevel(12);
        employee.setDept(dept);
        employee.setSalary(111000);
        //将業務數(shù)據對象Employee插入到KnowledgeSession中
        session.insert(employee);
        //執行(xíng)所有(yǒu)滿足條件的規則
        session.fireRules();
    }
}

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

​ 在實際使用中,可(kě)能還(hái)會(huì)向KnowledgeSession中添加參數(shù)數(shù)據(以Map形式添加),對應URule中的參數(shù)庫文件中定義的信息,引擎計(jì)算(suàn)完成後,我們要通(tōng)KnowledgeSession中的getParameter來(lái)獲取具體(tǐ)的參數(shù)對象,而不 能通(tōng)過原添加的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);
        //通(tōng)過KnowledgeService接口獲取指定的知識包ID"test123"
        KnowledgePackage knowledgePackage=service.getKnowledge("213");
        //通(tōng)過取到的KnowledgePackage對象創建KnowledgeSession對象
        KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);

        Employee employee=new Employee();
        Dept dept=new Dept();
        dept.setLevel(12);
        employee.setDept(dept);
        employee.setSalary(111000);
        //将業務數(shù)據對象Employee插入到KnowledgeSession中
        session.insert(employee);
        //執行(xíng)所有(yǒu)滿足條件的規則

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

        //獲取計(jì)算(suàn)後的result值,要通(tōng)過KnowledgeSession,而不能通(tōng)過原來(lái)的parameter對象
        boolean result=(Boolean)session.getParameter("result");
        System.out.println(result);
    }
}

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

觸發決策流

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

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);
        //通(tōng)過KnowledgeService接口獲取指定的知識包ID"213"
        KnowledgePackage knowledgePackage=service.getKnowledge("213");
        //通(tōng)過取到的KnowledgePackage對象創建KnowledgeSession對象
        KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);

        Employee employee=new Employee();
        Dept dept=new Dept();
        dept.setLevel(12);
        employee.setDept(dept);
        employee.setSalary(111000);
        //将業務數(shù)據對象Employee插入到KnowledgeSession中
        session.insert(employee);
        //執行(xíng)所有(yǒu)滿足條件的規則

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

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

        //獲取計(jì)算(suàn)後的result值,要通(tōng)過KnowledgeSession,而不能通(tōng)過原來(lái)的parameter對象
        boolean result=(Boolean)session.getParameter("result");
        System.out.println(result);
    }
}

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

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

results matching ""

    No results matching ""