使用GeneralEntity傳遞值
在代碼中調用知識包,對于需要插入到規則中的變量對象,可(kě)能當前環境裏并不存在,或者說這種變量的屬性是動态可(kě)變的,對于這兩種我們可(kě)以使用URule Pro中提供的GeneralEntity來(lái)代替實際的業務對象。
GeneralEntity擴展自HashMap,所以可(kě)以通(tōng)過Map的put方法将目标對象的屬性及其值在代碼中逐個(gè)填入,同時(shí)GeneralEntity實例化時(shí)要求必須要提供一個(gè)String類型的構造參數(shù),這個(gè)String類型的值表示的就是目标業務對象的完整類名。 通(tōng)過使用GeneralEntity來(lái)代替實際業務對象,代碼就是下面的樣子:
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中獲取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);
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);
//将業務數(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);
}
}
在上(shàng)面的代碼當中,我們就通(tōng)過GeneralEntity來(lái)代替實際的Employee和(hé)Dept對象插入到規則當中,運行(xíng)後我們發現其結果與實際的Employee和(hé)Dept對象插入到規則當中運行(xíng)結果完全一緻。
實際上(shàng),在URule Pro提供的快速測試、Rest調用、基于Excel的批量測試實際在調用規則傳遞變量時(shí)采用的都是GeneralEntity來(lái)代替實際的業務對象, 所以如果我們在代碼中調用業務規則實際業務對象不存在時(shí),也可(kě)以采用GeneralEntity實現業務數(shù)據的傳遞。