之前介绍了很多商业化的规则引擎,如drools、OpenL Tablets。虽然功能强大,但是由于是国外项目,英文文档多少有点障碍。在网上找了一下,还真有个国产开源的项目——urule。他是上海锐道信息技术有限公司出品,这里免费给他打个广告,挂个pro版的链接:智能风控决策引擎-可视化Java规则引擎-上海锐道URule Pro。虽然开源版是一个阉割版,相比于urule-pro,有很多功能不能使用,但已经很不错了,我们可以根据开源项目定制开发。
URULE PRO版与开源版主要功能比较 | ||
特性 | URULE PRO版 | URULE开源版 |
向导式决策集 | 有 | 有 |
脚本式决策集 | 有 | 有 |
决策树 | 有 | 有 |
决策流 | 有 | 有 |
决策表 | 有 | 有 |
交叉决策表 | 有 | 无 |
复杂评分卡 | 有 | 无 |
文件名、项目名重构 | 有 | 无 |
参数名、变量常量名重构 | 有 | 无 |
Excel决策表导入 | 有 | 无 |
规则集模版保存与加载 | 有 | 无 |
中文项目名和文件名支持 | 有 | 无 |
服务器推送知识包到客户端功能的支持 | 有 | 无 |
知识包优化与压缩的支持 | 有 | 无 |
客户端服务器模式下大知识包的推拉支持 | 有 | 无 |
规则集中执行组的支持 | 有 | 无 |
规则流中所有节点向导式条件与动作配置的支持 | 有 | 无 |
循环规则多循环单元支持 | 有 | 无 |
循环规则中无条件执行的支持 | 有 | 无 |
导入项目自动重命名功能 | 有 | 无 |
规则树构建优化 | 有 | 无 |
对象查找索引支持 | 有 | 无 |
规则树中短路计算的支持 | 有 | 无 |
规则条件冗余计算缓存支持 | 有 | 无 |
基于方案的批量场景测试功能 | 有 | 无 |
知识包调用监控 | 有 | 无 |
更为完善的文件读写权限控制 | 有 | 无 |
知识包版本控制 | 有 | 无 |
SpringBean及Java类的热部署 | 有 | 无 |
技术支持 | 有 | 无 |
简单使用:
1、概念:
- 库:用来存储规则操作的实体及规则触发后的动作。包括:参数库,变量库,常量库,动作库。
- 决策集:用来设置一个规则的集合,有两种设置方式,向导方式、脚本方式。
- 决策表:以表格形式设置规则。
- 决策树:以树形结构(思维导图的方式)设置规则。
- 评分卡:根据触发的规则,计算得分。
- 决策流:通过绑定多个决策节点,以流的形式进行规则的复合处理。
- 知识包:是将规则进行打包,供客户端使用。
2、接下来做一个简单的事例:
首先我们创建一个新项目,edas。然后创建一个参数库,一个字段是年龄、一个字段是姓名。
这里我们也可以创建一个变量库,如果server端有相关自定义类,我们还可以通过解析自动生成字段。
然后我们开始在决策集里制定规则:
当姓名不为空并且年龄小于18,我们输出一个message,用户未成年。
最后,我们定义一个知识包,把规则加载发布。
客户端怎么使用呢?
在客户端,我们声明KnowledgeService的bean,调用getKnowledge获取知识包,创建一个KnowledgeSession,通过调用KnowledgeSession的fireRules,就可以使用server端创建的规则集了。
@RequestMapping("/ageRule")
public Result rule(@RequestParam String age,@RequestParam String name) throws IOException {
//创建一个KnowledgeSession对象
KnowledgeService knowledgeService = (KnowledgeService) Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
KnowledgePackage knowledgePackage = knowledgeService.getKnowledge("edas/user_package");
KnowledgeSession session = KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);
Map param = new HashMap<>();
param.put("age", age);
param.put("name",name);
RuleExecutionResponse result = session.fireRules(param);
System.out.println("年龄:" + session.getParameter("age"));
System.out.println(session.getParameter("message"));
return new Result("0",session.getParameter("message").toString());
}
客户端比较简单,很容易接入咱们的业务系统中。这个开源项目操作容易,便于管理。已经完全满足我们项目中的需要了,很赞。开源代码还另外提供了springboot版本,但是springboot里没有太多代码,只是加载了server里注册的bean。页面交互层也仅仅用了servlet,也没有过多的分层。为了后续的定制开发,我后面会对他进行一系列的框架改造。
本文暂时没有评论,来添加一个吧(●'◡'●)