之前介绍了很多商业化的规则引擎,如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端创建的规则集了。 客户端比较简单,很容易接入咱们的业务系统中。这个开源项目操作容易,便于管理。已经完全满足我们项目中的需要了,很赞。开源代码还另外提供了springboot版本,但是springboot里没有太多代码,只是加载了server里注册的bean。页面交互层也仅仅用了servlet,也没有过多的分层。为了后续的定制开发,我后面会对他进行一系列的框架改造。简单使用:
@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<String, Object> 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());
}