JAVA规则引擎

一、概述
1 规则引擎概念
规则引擎是一种根据规则中包含的指定过滤条件,判断其能否匹配运行时刻的实时条件来执行规则中所规定的动作的引擎。

    规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,
并使用预定义的语义模块编写业务决策。

规则引擎具体执行可以分为接受数据输入,解释业务规则,业务决策三个过程。

2 规则引擎优势:
声明式编程。规则引擎允许你描述做什么而不是如何去做,规则比编码更容易阅读。

   逻辑与数据分离。数据保存在系统对象中,逻辑保存在规则中。打破了面向对象系统中将数据和逻辑耦合起来的局面。
由于逻辑保存在规则中,将来逻辑发生改变时更容易被维护。通过将逻辑集中在一个或数个清晰的规则文件中,
取代了之前分散在代码中的局面。

  速度及可测量性。Rete算法、Leaps算法,以及由此衍生出来的Drools的Rete、Leaps算法,提供了对系统数据
对象非常有效率的匹配。这些算法经过了大量实际考验的证明。

  知识集中化。通过使用规则,将建立一个可执行的规则库。这意味着规则库代表着现实中的业务策略的唯一对应,
理想情况下可读性高的规则还可以被当作文档使用。

  解释机制。通过将规则引擎的决断与决断的原因一起记录下来,规则系统提供了很好的“解释机制”。

  易懂的规则。通过建立对象模型以及DSL(域定义语言),可以用接近自然语言的方式来编写规则。这让非技术人员
与领域专家可以用他们自己的逻辑来理解规则(因为程序的复杂性已经被隐藏起来了) 。

3 规则引擎应用场景
相对于业务系统,规则引擎可以认为是一个独立于业务系统的模块,负责一些规则的计算等。一般来说,规则引擎主要应用在下面的场景中:

风控模型配置,风控规则的设置。
用户积分等配置,如日常操作引起积分变化等。
简单的离线计算,各类数据量比较小的统计等。
注意事项:规则引擎作为一个单独模块,有其自身的笨重与复杂,并不是所有相关业务系统都需要引入规则引擎。

必须建立一些数据模型。
考虑规则的冲突、优先级等。
控制规则的复杂度,以免给规则配置人员增加过多的学习成本。
由此可见,对于一些时间周期短、规则复杂且不常变更的项目,规则引擎并不十分适用。

二、原理简介
通常情况下,Java规则引擎内部由下面几个部分构成:工作内存(Working Memory)即工作区,用于存放被引擎引用的数据对象集合;规则执行队列,用于存放被激活的规则执行实例;静态规则区,用于存放所有被加载的业务规则,这些规则将按照某种数据结构组织,当工作区中的数据发生改变后,引擎需要迅速根据工作区中的对象现状,调整规则执行队列中的规则执行实例。Java规则引擎的结构示意图如图1所示。
在这里插入图片描述

图1 规则引擎执行结构图

  当引擎执行时,会根据规则执行队列中的优先顺序逐条执行规则执行实例,由于规则的执行部分可能会改变工作区
的数据对象,从而会使队列中的某些规则执行实例因为条件改变而失效,必须从队列中撤销,也可能会激活原来不满足
条件的规则,生成新的规则执行实例进入队列。于是就产生了一种“动态”的规则执行链,形成规则的推理机制。这种规
则的“链式”反应完全是由工作区中的数据驱动的。

三、规则引擎选型比较
以下项目均为开源,超链接中均有其github链接,上面有更为详尽的使用例子。表1 为综合对比结果。

表 1规则引擎综合对比

在这里插入图片描述

3.1 Drools
Drools是专注于解决业务代码和业务规则分离的引擎。Drools 规则是在 Java 应用程序上运行的,其要执行的步骤顺序由代码确定,Drools 规则引擎将业务规则转换成执行树。具体结构见图2。

在这里插入图片描述

图2 Drools流程图

优点:非常活跃的社区支持;易用;快速的执行速度;在 Java 开发人员中流行;与 Java Rule Engine API
(JSR 94)兼容。

3.2 MVEL
MVEL是一个功能强大的基于Java应用程序的表达式语言。作为一个表达式语言,旨在更高的效率,例如:直接支持集合、数组和字符串匹配等操作以及正则表达式。 MVEL用于执行使用Java语法编写的表达式。

   与Java不同,MVEL是动态类型(带有可选分类),也就是说在源文件中是没有类型限制的。一条MVEL表达式,简
单
的可以是单个标识符,复杂的则可能是一个充满了方法调用和内部集合创建的庞大的布尔表达式。

目前最新的版本是2.0,具有以下特性:

(1)动态JIT优化器。当负载超过一个确保代码产生的阈值时,选择性地产生字节代码,这大大减少了内存的使用量。新的静态类型检查和属性支持,允许集成类型安全表达;

(2) 错误报告改善,包括行和列的错误信息;

(3) 新的脚本语言特征。MVEL2.0 包含函数定义,如:闭包,lambda定义,标准循环构造(for, while, 
do-while, do-until…)。

(4) 改进的集成功能。迎合主流的需求,MVEL2.0支持基础类型的个性化属性处理器,集成到JIT中;

(5) 集成不良,字节码生成编译时间慢,还增加了可扩展性问题;不用字节码生成运行时执行非常慢。

3.3 Easy Rules
Easy Rules 是一款 Java 规则引擎,easy-rules首先集成了mvel表达式,后续可能集成SpEL的一款轻量级规则引擎,Easy Rules 提供了规则抽象来创建带有条件和操作的规则,以及运行一组规则来评估条件和执行操作的RulesEngine API。

  easy rules有以下特性:轻量级框架;学习成本低;基于POJO;为定义业务引擎提供有用的抽象和简便的应用;
从原始的规则组合成复杂的规则。它主要包括几个主要的类或接口:Rule,RulesEngine,RuleListener,
Facts ,以及几个主要的注解:@Action,@Condition,@Fact,@Priority,@Rule

3.4 Aviator
Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。Aviator的设计目标是轻量级和高性能 ,相比于Groovy、JRuby的笨重,Aviator非常小。

   但是Aviator的语法受到限制,它不是一门完整的语言,而只是语言的一小部分集合。其次,Aviator的实现
思路与其他轻量级的求值器很不相同,其他求值器一般都是通过解释的方式运行,而Aviator则是直接将表达式编译
成Java字节码,交给JVM去执行。其主要特点如下:

(1)支持大部分运算操作符,包括算术操作符、关系运算符、逻辑操作符、正则匹配操作符(=~)、三元表达式?: ,并且支持操作符的优先级和括号强制优先级,具体请看后面的操作符列表;

(2)支持函数调用和自定义函数;

(3)支持正则表达式匹配,类似Ruby、Perl的匹配语法,并且支持类Ruby的$digit指向匹配分组。自动类型转换,当执行操作的时候,会自动判断操作数类型并做相应转换,无法转换即抛异常;

(4)支持传入变量,支持类似a.b.c的嵌套变量访问;

(5)性能优秀;

(6)Aviator的限制,没有if else、do while等语句,没有赋值语句,仅支持逻辑表达式、算术表达式、三元表达式和正则匹配,没有位运算符。

转载: https://my.oschina.net/woniuyi/blog/3119383

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值