概述
在URule Pro當中(zhōng)是不能(néng)直接調用(yòng)具(jù)體(tǐ)的規則文(wén)件的,我們需要先将定義好的規則文(wén)件放到知識包中(zhōng),然後才可(kě)以對規則文(wén)件進行測試和調用(yòng)。
在代碼中(zhōng)調用(yòng)知識包,需要先通過KnowledgeService接口可(kě)獲取指定的知識包ID對應的構建好的資源包信息,然後通過知識包來創建具(jù)體(tǐ)的KnowledgeSession對象,接下來插入相關業務(wù)對象,最後執行具(jù)體(tǐ)的規則調用(yòng)。
KnowledgeService接口源碼如下:
package com.bstek.urule.runtime.service;
import java.io.IOException;
import com.bstek.urule.runtime.KnowledgePackage;
/**
* @author Jacky.gao
* @since 2015年1月28日
*/
public interface KnowledgeService {
public static final String BEAN_ID="urule.knowledgeService";
/**
* 根據給定的資源包ID獲取對應的KnowledgePackage對象
* @param packageId 知識包的ID,為(wèi)一個數字
* @return 返回與給定的資源包ID獲取對應的KnowledgePackage對象
* @throws IOException
*/
KnowledgePackage getKnowledge(String packageId) throws IOException;
/**
* 根據給定的一個或多(duō)個資源包ID獲取對應的KnowledgePackage對象的集合
* @param packageIds 資源包ID數組
* @return 返回與給定的一個或多(duō)個資源包ID獲取對應的KnowledgePackage對象集合
* @throws IOException
*/
KnowledgePackage[] getKnowledges(String[] packageIds) throws IOException;
}
這個接口中(zhōng)有(yǒu)兩個方法可(kě)供使用(yòng),一個是給一個知識包ID返回一個對應的KnowledgePackage對象;另一個是給一個或多(duō)個知識包ID,返回一個集合類型的KnowledgePackage對象。在URule Pro當中(zhōng),對于一個知識包,在使用(yòng)時引擎會将其構建成KnowledgePackage對象,在這個KnowledgePackage對象中(zhōng)包含了所有(yǒu)由向決策集、決策表、交叉決策表、決策樹、評分(fēn)卡、複雜評分(fēn)卡以及決策流等文(wén)件構建的RuleSet對象,以及由規則流構成的FlowDefinition對象。
在使用(yòng)getKnowledge方法獲取某個指定的package時,要給一個知識包ID,需要注意的是就是我們在項目中(zhōng)定義具(jù)體(tǐ)知識包對應的編号值,它是一個數字,如下图所示:
通過KnowledgeService接口獲取到KnowledgePackage對象後,接下來就可(kě)通過KnowledgePackage對象創建com.bstek.urule.runtime.KnowledgeSession對象,這個對象就是引擎提供的與業務(wù)數據交互的接口,通過這個接口,可(kě)将需要的業務(wù)數據對象插入到引擎當中(zhōng),最後根據需要執行規則或規則流。
package com.bstek.urule.runtime;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import com.bstek.urule.runtime.agenda.AgendaFilter;
import com.bstek.urule.runtime.response.FlowExecutionResponse;
import com.bstek.urule.runtime.response.RuleExecutionResponse;
import com.bstek.urule.runtime.rete.ReteInstance;
public interface KnowledgeSession extends WorkingMemory{
/**
* 執行當前WorkMemory中(zhōng)所有(yǒu)滿足條件的規則
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則執行耗時,滿足條件的規則,執行的規則等信息
*/
RuleExecutionResponse fireRules();
/**
* 對當前WorkMemory中(zhōng)所有(yǒu)滿足條件的規則進行過濾執行
* @param filter 對滿足條件的規則進行過濾
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則執行耗時,滿足條件的規則,執行的規則等信息
*/
RuleExecutionResponse fireRules(AgendaFilter filter);
/**
* 對當前WorkMemory中(zhōng)所有(yǒu)滿足條件的規則進行過濾執行,并向WorkingMemory中(zhōng)設置一個Map的參數對象
* @param parameters 向WorkingMemory中(zhōng)設置一個Map的參數對象
* @param filter 對滿足條件的規則進行過濾
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則執行耗時,滿足條件的規則,執行的規則等信息
*/
RuleExecutionResponse fireRules(Map<String,Object> parameters,AgendaFilter filter);
/**
* 對當前WorkMemory中(zhōng)所有(yǒu)滿足條件的規則進行執行,并定義執行的最大數目,超出後就不再執行
* @param max 執行規則的最大數目
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則執行耗時,滿足條件的規則,執行的規則等信息
*/
RuleExecutionResponse fireRules(int max);
/**
* 對當前WorkMemory中(zhōng)所有(yǒu)滿足條件的規則進行執行,并定義執行的最大數目,超出後就不再執行,<br>
* 并向WorkingMemory中(zhōng)設置一個Map的參數對象
* @param parameters 向WorkingMemory中(zhōng)設置一個Map的參數對象
* @param max 執行規則的最大數目
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則執行耗時,滿足條件的規則,執行的規則等信息
*/
RuleExecutionResponse fireRules(Map<String,Object> parameters,int max);
/**
* 對當前WorkMemory中(zhōng)所有(yǒu)滿足條件的規則進行過濾執行,并定義執行數目的最大值
* @param filter 對滿足條件的規則進行過濾
* @param max 執行規則的最大數目
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則執行耗時,滿足條件的規則,執行的規則等信息
*/
RuleExecutionResponse fireRules(AgendaFilter filter,int max);
/**
* 對當前WorkMemory中(zhōng)所有(yǒu)滿足條件的規則進行過濾執行,并定義執行數目的最大值,<br>
* 并向WorkingMemory中(zhōng)設置一個Map的參數對象
* @param parameters 向WorkingMemory中(zhōng)設置一個Map的參數對象
* @param filter 對滿足條件的規則進行過濾
* @param max 執行規則的最大數目
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則執行耗時,滿足條件的規則,執行的規則等信息
*/
RuleExecutionResponse fireRules(Map<String,Object> parameters,AgendaFilter filter,int max);
/**
* 對當前WorkMemory中(zhōng)所有(yǒu)滿足條件的規則進行執行,并向WorkingMemory中(zhōng)設置一個Map的參數對象
* @param parameters 向WorkingMemory中(zhōng)設置一個Map的參數對象
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則執行耗時,滿足條件的規則,執行的規則等信息
*/
RuleExecutionResponse fireRules(Map<String,Object> parameters);
/**
* 根據規則流ID,執行目标規則流
* @param processId 要執行的規則流ID
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則流執行耗時信息
*/
FlowExecutionResponse startProcess(String processId);
/**
* 根據規則流ID,執行目标規則流,并向WorkingMemory中(zhōng)設置一個Map的參數對象
* @param processId 要執行的規則流ID
* @param parameters 向WorkingMemory中(zhōng)設置一個Map的參數對象
* @return 返回一個ExecutionResponse對象,其中(zhōng)包含規則流執行耗時信息
*/
FlowExecutionResponse startProcess(String processId,Map<String,Object> parameters);
/**
* 執行将日志(zhì)信息寫入到日志(zhì)文(wén)件操作(zuò),要看到日志(zhì)文(wén)件我們需要設置urule.debugToFile屬性值為(wèi)true,<br>
* 同時定義輸出文(wén)件目錄屬性urule.defaultHtmlFileDebugPath,這樣在urule.debug屬性為(wèi)true情況下就會向這個目錄下寫入日志(zhì)文(wén)件,<br>
* 需要的時候,可(kě)以通過實現com.bstek.urule.debug.DebugWriter接口定義自己的日志(zhì)輸出文(wén)件,這樣就可(kě)以将日志(zhì)輸出到任何地方
* @throws IOException 抛出IO異常
*/
void writeLogFile() throws IOException;
/**
* @return 返回對應的知識包集合
*/
List<KnowledgePackage> getKnowledgePackageList();
/**
* @return 返回Rete實例對象集合
*/
List<ReteInstance> getReteInstanceList();
/**
* @return 返回當前緩存的KnowledgeSession Map對象
*/
Map<String,KnowledgeSession> getKnowledgeSessionMap();
/**
* @return 返回當前KnowledgeSession的父,如果不存在則返回null
*/
KnowledgeSession getParentSession();
}
KnowledgeSession接口擴展自WorkingMemory接口,WorkingMemory接口源碼如下:
package com.bstek.urule.runtime;
import java.util.List;
import java.util.Map;
import com.bstek.urule.runtime.log.LogManager;
import com.bstek.urule.runtime.rete.Context;
public interface WorkingMemory{
/**
* 插入一個業務(wù)數據對象,對應到規則當中(zhōng)就是一個變量對象
* @param fact 目标業務(wù)數據對象
* @return 插入是否成功
*/
boolean insert(Object fact);
/**
* 更新(xīn)一個在當前WorkingMemory中(zhōng)已存在的業務(wù)對象,如果對象存在,那麽WorkingMemory會重新(xīn)評估這個對象
* @param fact 要更新(xīn)的對象
* @return 更新(xīn)是否成功,如果對象不在WorkingMemory中(zhōng),則返回false
*/
boolean update(Object fact);
/**
* 獲取當前WorkingMemory中(zhōng)的某個參數值
* @param key 參數對應的key值
* @return 返回具(jù)體(tǐ)的值
*/
Object getParameter(String key);
/**
* @return 返回所有(yǒu)的參數對象
*/
Map<String,Object> getParameters();
/**
* @return 返回當前WorkingMemory中(zhōng)所有(yǒu)類型的業務(wù)數據對象
*/
Map<String,Object> getAllFactsMap();
/**
* @return 返回插入到當前WorkingMemory中(zhōng)所有(yǒu)業務(wù)對象
*/
List<Object> getFactList();
/**
* 根據knowledgePackageWrapper的id返回對應的KnowledgeSession對象
* @param id knowledgePackageWrapper的id
* @return 對應的KnowledgeSession對象
*/
KnowledgeSession getKnowledgeSession(String id);
/**
* 将KnowledgeSession對象放入緩存以備下次調用(yòng)時使用(yòng)
* @param id knowledgePackageWrapper的id
* @param session 對應的KnowledgeSession對象
*/
void putKnowledgeSession(String id,KnowledgeSession session);
/**
* 向當前Session中(zhōng)放入變量
* @param key 變量Key
* @param value 變量值
*/
void setSessionValue(String key,Object value);
/**
* 取出當前Session中(zhōng)對應的變量
* @param key 變量key
* @return 變量值
*/
Object getSessionValue(String key);
/**
* @return 返回當前SessionValueMap對象
*/
Map<String,Object> getSessionValueMap();
/**
* 激活某個設置了互斥組屬性的具(jù)體(tǐ)的規則
* @param activationGroupName 互斥組屬性值
* @param ruleName 規則名(míng)
*/
void activeRule(String activationGroupName,String ruleName);
/**
* 激活指定名(míng)稱的執行組
* @param groupName 執行組名(míng)稱
*/
void activePendedGroup(String groupName);
/**
* 激活指定名(míng)稱的執行組并立即執行執行組規則對應的動作(zuò)部分(fēn)
* @param groupName 執行組名(míng)稱
*/
void activePendedGroupAndExecute(String groupName);
/**
* 返回當前上下文(wén)對象
* @return 返回當前上下文(wén)對象
*/
Context getContext();
/**
* @return 返回當前LogManager對象
*/
LogManager getLogManager();
/**
* @return 返回當前FactManager對象
*/
FactManager getFactManager();
}
要通過KnowledgePackage對象或這個對象的數組創建一個KnowledgeSession對象,可(kě)以通過com.bstek.urule.runtime.KnowledgeSessionFactory類中(zhōng)下面兩個靜态方法實現:
/**
* 創建一個普通的KnowledgeSession對象
* @param knowledgePackage 創建KnowledgeSession對象所需要的KnowledgePackage對象
* @return 返回一個新(xīn)的KnowledgeSession對象
*/
public static KnowledgeSession newKnowledgeSession(KnowledgePackage knowledgePackage){
return new KnowledgeSessionImpl(knowledgePackage);
}
/**
* 創建一個普通的KnowledgeSession對象
* @param knowledgePackage 創建KnowledgeSession對象所需要的KnowledgePackage集合對象
* @return 返回一個新(xīn)的KnowledgeSession對象
*/
public static KnowledgeSession newKnowledgeSession(KnowledgePackage[] knowledgePackages){
return new KnowledgeSessionImpl(knowledgePackages);
}