使用(yòng)GeneralEntity傳遞值
在代碼中(zhōng)調用(yòng)知識包,對于需要插入到規則中(zhōng)的變量對象,可(kě)能(néng)當前環境裏并不存在,或者說這種變量的屬性是動态可(kě)變的,對于這兩種我們可(kě)以使用(yòng)URule Pro中(zhōng)提供的GeneralEntity來代替實際的業務(wù)對象。
GeneralEntity擴展自HashMap,所以可(kě)以通過Map的put方法将目标對象的屬性及其值在代碼中(zhōng)逐個填入,同時GeneralEntity實例化時要求必須要提供一個String類型的構造參數,這個String類型的值表示的就是目标業務(wù)對象的完整類名(míng)。 通過使用(yòng)GeneralEntity來代替實際業務(wù)對象,代碼就是下面的樣子:
package tt;
import java.util.HashMap;
import java.util.Map;
import com.bstek.urule.Utils;
import com.bstek.urule.model.GeneralEntity;
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);
GeneralEntity employee=new GeneralEntity("rete.test.Employee");
GeneralEntity dept=new GeneralEntity("rete.test.Dept");
dept.put("level",12);
employee.put("dept",dept);
employee.put("salary",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);
}
}
在上面的代碼當中(zhōng),我們就通過GeneralEntity來代替實際的Employee和Dept對象插入到規則當中(zhōng),運行後我們發現其結果與實際的Employee和Dept對象插入到規則當中(zhōng)運行結果完全一緻。
實際上,在URule Pro提供的快速測試、Rest調用(yòng)、基于Excel的批量測試實際在調用(yòng)規則傳遞變量時采用(yòng)的都是GeneralEntity來代替實際的業務(wù)對象, 所以如果我們在代碼中(zhōng)調用(yòng)業務(wù)規則實際業務(wù)對象不存在時,也可(kě)以采用(yòng)GeneralEntity實現業務(wù)數據的傳遞。