Urule Pro 知识包的应用

1.介绍

在URule Pro当中定义好各种类型的规则文件后,需要将要调用的规则文件通过规则项目的“知识包”节点将文件打包后才可以被业务系统调用。对于业务系统来说,和规则引擎打交道的地方就是知识包,无论是SDK调用还是Rest服务调用,都是先获取知识包再执行知识包中的决策集或决策流的。

知识包的ID就是对外暴露服务的ID编号,在维护知识包的时候可以看到这个ID:

如上面范例,如果我们要调用card_choles的知识包,则代码编写大致如下

KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
//通过KnowledgeService接口获取指定的知识包card_choles对应的知识包
KnowledgePackage knowledgePackage=service.getKnowledge("1");

对于已经创建好的知识包,还需要通过知识包的启用和发布等环节才能正式对外提供知识包的调用服务。

2.创建知识包

在URule Pro当中定义好各种类型的规则文件后,需要将要调用的规则文件通过规则项目的“知识包”节点将文件打包后才可以被业务系统调用。 规则包在调用前需要对定义好的知识包进行各种测试,在URule Pro中就提供了两种不同类型的针对知识包的测试方法,分别是快速测试基于场景的批量测试,前者是单条数据测试,后者是多条数据测试。在目标知识包上点击右键,从弹出的菜单中就可以看到它们,如下图所示:

3.基于场景的批量测试

3.1点击添加测试项

3.2填写名称和描述-->Excel模板配置于下载

3.3选择输入和输出变量,点击下载Excel模板

3.4填好Excel表格中的内容后,点击上传文件

4.启用知识包

4.1启用当前知识包-->申请启动知识包

4.2在我的任务-->待处理-->批准启用知识包

5.发布知识包

5.1发布当前知识包-->申请发布知识包

5.2在我的任务-->待处理-->批准发布知识包

发布好的知识包可以启用Rest服务配置

6.知识包调用监控配置

6.1监控配置

勾选“启用对当前知识包的调用监控”选项后,就可以看到具体可配置的监控选项,整个监控的选项分为两个部分,既输入数据以及输出数据。

当前知识包中规则如果开启“允许调试信息输出”属性,同时运行项目中将urule.debug属性配置为true,那么监控时会自动记录规则运行时产生的日志。

之前我们对规则中“允许调试信息输出”属性以及运行项目中urule.debug属性有过介绍,要求在生产环境中一定要把urule.debug属性设置为false,这样所有的调试信息都将不再产生,就不会对性能产生影响。

监控配置窗口会把当前知识包中用到的所有变量及参数根据其用途属性罗列出来,我们需要做的就是根据需要进行勾选,这样在监控运行时会所勾选的输入以及输出信息都记录下来,给我们自定义的监控实现类使用。

监控配置窗口在输入数据部分只会罗列变量及参数中用途为 In及InOut类型,输出只会罗列 Out及InOut类型。
注意:监控操作针对的是规则的执行,规则执行调用的是已发布的知识包,因此,监控中配置的输入和输出变量及参数也是来自当前知识包中处于 启用状态的已发布的知识包。所以配置知识包监控,要确保当前知识包已经发布,且处于启用状态的已发布的知识包必须是我们需要的那个。

6.2Rest服务监控配置

如果我们当前调用规则采用的是Rest服务方式,那么配置好监控内容后,在通过Rest服务调用规则时系统会自动根据这里的配置对规则调用进行记录监控,无须再做别的配置;如果我们使用的是API方式调用规则,那么还需要编写具体的监控数据处理实现类,该类编写完成后需要配置到Spring上下文中,使其成为一个标准的Spring Bean,这样引擎才能发现并使用它,该类接口源码如下:

package com.bstek.urule.runtime.monitor;
/**
 * @author Jacky.gao
 * @since 2018年12月17日
 */
public interface InvokeMonitor {
    void doMonitor(MonitorData data);
}

在这个接口中,需要实现的方法只有一个,参数也只有一个,在这个MonitorData参数里,已经把上述知识包监控配置里要求监控的内容都准备好了,我们直接调用即可,MonitorData源码如下:

package com.bstek.urule.runtime.monitor;

import java.util.List;

import com.bstek.urule.model.rete.RuleData;
import com.bstek.urule.runtime.log.FlowNodeLog;
import com.bstek.urule.runtime.log.Log;
import com.bstek.urule.runtime.log.MatchedRuleLog;

/**
 * @author Jacky.gao
 * @since 2018年12月18日
 */
public interface MonitorData {

    /**
     * @return 返回当前监控的知识包名称信息:项目名称/知识包ID
     */
    String getPackageInfo();

    /**
     * @return 返回规则运行总的耗时,单位为毫秒
     */
    long getTotalDuration();

    /**
     * @return 返回当前知识包版本,如果当前知识包没有发布版本,则该值为空
     */
    String getVersion();

    /**
     * @return 返回所有匹配的规则对象信息
     */
    List<MatchedRuleLog> getMatchedRuleList();

    /**
     * @return 返回所有不匹配的规则对象信息
     */
    List<RuleData> getNotMatchRuleList();

    /**
     * @return 返回所有触发了的规则流节点信息(如果当前有规则流的话)
     */
    List<FlowNodeLog> getFiredFlowNodeList();

    /**
     * @return 返回所有输入日志信息(如果当前配置的日志信息输出的话)
     */
    List<Log> getLogs();

    /**
     * @return 返回指定的输入信息
     */
    List<IOData> getInputData();

    /** 
     * @return 返回规则计算后指定的输出信息
     */
    List<IOData> getOutputData();

}

可以看到,在MonitorData接口中,可以获取到当前知识包监控配置的所有信息,这样在记录这个信息时可以先判断系统是否配置了要监控这项信息,以防获取到的信息为空情况发生。下面的这个实现类在输出要监控的信息时就加了判断:

package test;

import com.bstek.urule.runtime.monitor.InvokeMonitor;
import com.bstek.urule.runtime.monitor.MonitorData;

/**
 * @author Jacky.gao
 * @since 2018年12月17日
 */
public class TestInvokeMonitor implements InvokeMonitor {

    public void doMonitor(MonitorData data) {
        System.out.println("日志:"+data.getLogs());
        System.out.println("触发的规则节点列表:"+data.getFiredFlowNodeList());
        System.out.println("匹配的规则列表:"+data.getMatchedRuleList());
        System.out.println("不匹配的规则列表:"+data.getNotMatchRuleList());
        System.out.println("耗时:"+data.getTotalDuration());
        System.out.println("packageInfo:"+data.getPackageInfo());
        System.out.println("输入数据:"+data.getInputData());
        System.out.println("输出数据:"+data.getOutputData());
    }
}
需要注意的是,如果我们使用URule Pro的方式为客户端服务器模式,同时又想对知识包调用进行监控,那么InvokeMonitor的实现类则必须配置在知识包实际运行的客户端,原因很简单,因为知识包是在客户端运行,要监控知识包,必须要保证当前知识包运行环境里能检测到InvokeMonitor的实现类,所以需要这么配置。

7.知识包多环境部署(知识包的导出导入)

7.1知识包的导出

7.2知识包的导入

注意:

  • 如果当前知识包中有通过规则调用其他知识包的动作,由于当前环境中可能不存在被调用知识包,会导致调用失败。

  • 已经通过上传启用的知识包,后续如果【修改】绑定上传知识包,重新上传data文件,在保存后会同步到集群管理中配置的其他节点,客户端推送需要在知识包右键菜单中,点击【推送到客户端】。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值