單次觸發決策集
下面的代碼中(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及以往版本不同,需要我們特别注意。