概述
在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,需要注意的是就是我们在项目中定义具体知识包对应的编号值,它是一个数字,如下图所示:
通过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);
}