之前介绍了很多商业化的规则引擎,如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,也没有过多的分层。为了后续的定制开发,我后面会对他进行一系列的框架改造。


本文暂时没有评论,来添加一个吧(●'◡'●)