概述

​ 在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ǐ)知識包對應的編号值,它是一個數字,如下图所示:

packet

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

results matching ""

    No results matching ""