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