概述

​ 在URule Pro当中是不能直接调用具体的规则文件的,我们需要先将定义好的规则文件放到知识包中,然后才可以对规则文件进行测试和调用。

​ 在代码中调用知识包,需要先通过KnowledgeService接口可获取指定的知识包ID对应的构建好的资源包信息,然后通过知识包来创建具体的KnowledgeSession对象,接下来插入相关业务对象,最后执行具体的规则调用。

​ 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,为一个数字
     * @return 返回与给定的资源包ID获取对应的KnowledgePackage对象
     * @throws IOException
     */
    KnowledgePackage getKnowledge(String packageId) throws IOException;
    /**
     * 根据给定的一个或多个资源包ID获取对应的KnowledgePackage对象的集合
     * @param packageIds 资源包ID数组
     * @return 返回与给定的一个或多个资源包ID获取对应的KnowledgePackage对象集合
     * @throws IOException
     */
    KnowledgePackage[] getKnowledges(String[] packageIds) throws IOException;
}

​ 这个接口中有两个方法可供使用,一个是给一个知识包ID返回一个对应的KnowledgePackage对象;另一个是给一个或多个知识包ID,返回一个集合类型的KnowledgePackage对象。在URule Pro当中,对于一个知识包,在使用时引擎会将其构建成KnowledgePackage对象,在这个KnowledgePackage对象中包含了所有由向决策集、决策表、交叉决策表、决策树、评分卡、复杂评分卡以及决策流等文件构建的RuleSet对象,以及由规则流构成的FlowDefinition对象。

在使用getKnowledge方法获取某个指定的package时,要给一个知识包ID,需要注意的是就是我们在项目中定义具体知识包对应的编号值,它是一个数字,如下图所示:

packet

​ 通过KnowledgeService接口获取到KnowledgePackage对象后,接下来就可通过KnowledgePackage对象创建com.bstek.urule.runtime.KnowledgeSession对象,这个对象就是引擎提供的与业务数据交互的接口,通过这个接口,可将需要的业务数据对象插入到引擎当中,最后根据需要执行规则或规则流。

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中所有满足条件的规则
     * @return 返回一个ExecutionResponse对象,其中包含规则执行耗时,满足条件的规则,执行的规则等信息
     */
    RuleExecutionResponse fireRules();
    /**
     * 对当前WorkMemory中所有满足条件的规则进行过滤执行
     * @param filter 对满足条件的规则进行过滤
     * @return 返回一个ExecutionResponse对象,其中包含规则执行耗时,满足条件的规则,执行的规则等信息
     */
    RuleExecutionResponse fireRules(AgendaFilter filter);
    /**
     * 对当前WorkMemory中所有满足条件的规则进行过滤执行,并向WorkingMemory中设置一个Map的参数对象
     * @param parameters 向WorkingMemory中设置一个Map的参数对象
     * @param filter 对满足条件的规则进行过滤
     * @return 返回一个ExecutionResponse对象,其中包含规则执行耗时,满足条件的规则,执行的规则等信息
     */
    RuleExecutionResponse fireRules(Map<String,Object> parameters,AgendaFilter filter);
    /**
     * 对当前WorkMemory中所有满足条件的规则进行执行,并定义执行的最大数目,超出后就不再执行
     * @param max 执行规则的最大数目
     * @return 返回一个ExecutionResponse对象,其中包含规则执行耗时,满足条件的规则,执行的规则等信息
     */
    RuleExecutionResponse fireRules(int max);
    /**
     * 对当前WorkMemory中所有满足条件的规则进行执行,并定义执行的最大数目,超出后就不再执行,<br>
     * 并向WorkingMemory中设置一个Map的参数对象
     * @param parameters 向WorkingMemory中设置一个Map的参数对象
     * @param max 执行规则的最大数目
     * @return 返回一个ExecutionResponse对象,其中包含规则执行耗时,满足条件的规则,执行的规则等信息
     */
    RuleExecutionResponse fireRules(Map<String,Object> parameters,int max);
    /**
     * 对当前WorkMemory中所有满足条件的规则进行过滤执行,并定义执行数目的最大值
     * @param filter 对满足条件的规则进行过滤
     * @param max 执行规则的最大数目
     * @return 返回一个ExecutionResponse对象,其中包含规则执行耗时,满足条件的规则,执行的规则等信息
     */
    RuleExecutionResponse fireRules(AgendaFilter filter,int max);
    /**
     * 对当前WorkMemory中所有满足条件的规则进行过滤执行,并定义执行数目的最大值,<br>
     * 并向WorkingMemory中设置一个Map的参数对象
     * @param parameters 向WorkingMemory中设置一个Map的参数对象
     * @param filter 对满足条件的规则进行过滤
     * @param max 执行规则的最大数目
     * @return 返回一个ExecutionResponse对象,其中包含规则执行耗时,满足条件的规则,执行的规则等信息
     */
    RuleExecutionResponse fireRules(Map<String,Object> parameters,AgendaFilter filter,int max);
    /**
     * 对当前WorkMemory中所有满足条件的规则进行执行,并向WorkingMemory中设置一个Map的参数对象
     * @param parameters 向WorkingMemory中设置一个Map的参数对象
     * @return 返回一个ExecutionResponse对象,其中包含规则执行耗时,满足条件的规则,执行的规则等信息
     */
    RuleExecutionResponse fireRules(Map<String,Object> parameters);
    /**
     * 根据规则流ID,执行目标规则流
     * @param processId 要执行的规则流ID
     * @return 返回一个ExecutionResponse对象,其中包含规则流执行耗时信息
     */
    FlowExecutionResponse startProcess(String processId);
    /**
     * 根据规则流ID,执行目标规则流,并向WorkingMemory中设置一个Map的参数对象
     * @param processId 要执行的规则流ID
     * @param parameters 向WorkingMemory中设置一个Map的参数对象
     * @return 返回一个ExecutionResponse对象,其中包含规则流执行耗时信息
     */
    FlowExecutionResponse startProcess(String processId,Map<String,Object> parameters);

    /**
     * 执行将日志信息写入到日志文件操作,要看到日志文件我们需要设置urule.debugToFile属性值为true,<br>
     * 同时定义输出文件目录属性urule.defaultHtmlFileDebugPath,这样在urule.debug属性为true情况下就会向这个目录下写入日志文件,<br>
     * 需要的时候,可以通过实现com.bstek.urule.debug.DebugWriter接口定义自己的日志输出文件,这样就可以将日志输出到任何地方
     * @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{
    /**
     * 插入一个业务数据对象,对应到规则当中就是一个变量对象
     * @param fact 目标业务数据对象
     * @return 插入是否成功
     */
    boolean insert(Object fact);

    /**
     * 更新一个在当前WorkingMemory中已存在的业务对象,如果对象存在,那么WorkingMemory会重新评估这个对象
     * @param fact 要更新的对象
     * @return 更新是否成功,如果对象不在WorkingMemory中,则返回false
     */
    boolean update(Object fact);
    /**
     * 获取当前WorkingMemory中的某个参数值
     * @param key 参数对应的key值
     * @return 返回具体的值
     */
    Object getParameter(String key);
    /**
     * @return 返回所有的参数对象
     */
    Map<String,Object> getParameters();

    /**
     * @return 返回当前WorkingMemory中所有类型的业务数据对象
     */
    Map<String,Object> getAllFactsMap();

    /**
     * @return 返回插入到当前WorkingMemory中所有业务对象
     */
    List<Object> getFactList();

    /**
     * 根据knowledgePackageWrapper的id返回对应的KnowledgeSession对象
     * @param id knowledgePackageWrapper的id
     * @return 对应的KnowledgeSession对象
     */
    KnowledgeSession getKnowledgeSession(String id);

    /**
     * 将KnowledgeSession对象放入缓存以备下次调用时使用
     * @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();


    /**
     * 激活某个设置了互斥组属性的具体的规则
     * @param activationGroupName 互斥组属性值
     * @param ruleName 规则名
     */
    void activeRule(String activationGroupName,String ruleName);

    /**
     * 激活指定名称的执行组
     * @param groupName 执行组名称
     */
    void activePendedGroup(String groupName);

    /**
     * 激活指定名称的执行组并立即执行执行组规则对应的动作部分
     * @param groupName 执行组名称
     */
    void activePendedGroupAndExecute(String groupName);

    /**
     * 返回当前上下文对象
     * @return 返回当前上下文对象
     */
    Context getContext();

    /**
     * @return 返回当前LogManager对象
     */
    LogManager getLogManager();

    /**
     * @return 返回当前FactManager对象
     */
    FactManager getFactManager();
}

​ 要通过KnowledgePackage对象或这个对象的数组创建一个KnowledgeSession对象,可以通过com.bstek.urule.runtime.KnowledgeSessionFactory类中下面两个静态方法实现:

/**
 * 创建一个普通的KnowledgeSession对象
 * @param knowledgePackage 创建KnowledgeSession对象所需要的KnowledgePackage对象
 * @return 返回一个新的KnowledgeSession对象
 */
public static KnowledgeSession newKnowledgeSession(KnowledgePackage knowledgePackage){
    return new KnowledgeSessionImpl(knowledgePackage);
}

/**
 * 创建一个普通的KnowledgeSession对象
 * @param knowledgePackage 创建KnowledgeSession对象所需要的KnowledgePackage集合对象
 * @return 返回一个新的KnowledgeSession对象
 */
public static KnowledgeSession newKnowledgeSession(KnowledgePackage[] knowledgePackages){
    return new KnowledgeSessionImpl(knowledgePackages);
}

results matching ""

    No results matching ""