單次觸發決策集
下面的代碼中演示了單次調用知識包完整的調用過程:
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及以往版本不同,需要我們特别注意。