概述

​ 在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ù)字,如下圖所示:

packet

​ 通(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);
}

results matching ""

    No results matching ""