本文主要讲解“Java规则引擎有哪些优势”,感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习“Java规则引擎有什么优势”!
00-101010
一、概述
规则引擎是根据规则中包含的指定过滤条件,判断是否能够匹配运行时的实时条件来执行规则中指定的动作的引擎。
规则引擎由推理机发展而来,是嵌入在应用程序中的组件,可以将业务决策从应用程序代码中分离出来,并使用预定义的语义模块来编写业务决策。
规则的具体执行可以分为三个过程:接受数据输入、解释业务规则和做出业务决策。
00-1010声明式编程。规则引擎允许你描述做什么而不是怎么做。规则比代码更容易阅读。
逻辑和数据的分离。数据存储在系统对象中,逻辑存储在规则中。它打破了面向对象系统中数据与逻辑耦合的局面。因为逻辑存储在规则中,所以将来逻辑发生变化时更容易维护。通过将逻辑集中在一个或几个清晰的规则文件中,之前分散在代码中的情况被取代了。
以及速度的可测量性。Rete算法、Leaps算法以及由此衍生的Drools的Rete和Leaps算法为系统数据对象提供了非常高效的匹配。这些算法已经被大量的实际测试所证明。
知识集中化。通过使用规则,将建立一个可执行的规则库。这意味着规则库代表了现实中业务策略的唯一对应关系,理想情况下,可读性高的规则也可以作为文档使用。
解释机制。通过记录规则引擎的决策以及决策的原因,规则系统提供了一个很好的“解释机制”。
可以理解的规则。通过建立对象模型和DSL(领域定义语言),可以用接近自然语言的方式编写规则。这使得非技术人员和领域专家能够用自己的逻辑理解规则(因为程序的复杂性已经被隐藏了)。
1 规则引擎概念
与业务系统相比,规则引擎可以看作是一个独立于业务系统的模块,负责一些规则的计算等等。一般来说,规则引擎主要用于以下场景:
风险控制模型的配置和风险控制规则的设置。
用户积分等配置,如日常操作积分变化等。
简单的离线计算,数据量小的统计等。
注意:规则引擎作为一个独立的模块,有其自身的庞大性和复杂性,并不是所有相关的业务系统都需要引入规则引擎。
必须建立一些数据模型。
考虑冲突、优先事项等。规则。
控制规则的复杂度,以免给规则配置器增加太多的学习成本。
因此,规则引擎不太适合一些时间周期短、规则复杂、变更不频繁的项目。
00-1010一般来说,Java规则引擎由以下几个部分组成:Working Memory,即工作空间,用于存储引擎引用的数据对象的集合;用于存储激活的规则执行实例的规则执行队列;静态规则区用于存储所有加载的业务规则,这些规则将按照一定的数据结构进行组织。当工作空间中的数据发生变化时,引擎需要根据工作空间中对象的状态快速调整规则执行队列中的规则执行实例。Java规则引擎的结构图如图1所示。
图1规则引擎执行结构图
引擎执行时,会按照规则执行队列中的优先级顺序,逐一执行规则执行实例。因为规则的执行部分可能会改变工作区中的数据对象,所以队列中的一些规则执行实例会因为条件的改变而失效,必须从队列中撤销。它还可以激活不符合条件的原始规则,并生成新的规则执行实例来进入队列。于是产生了“动态”的规则执行链,形成了规则推理机制。这个规则的“连锁”反应完全是由工作空间中的数据驱动的。
00-1010以下的项目都是开源的,超链接中有github链接,有更详细的使用示例。表1显示了综合比较结果。
表1规则引擎的综合比较
class="firstRow">
适用场景
优点
缺点
活跃性
综合评估
Drools
决业务代码和业务规则分离;适用于大型应用系统
性能高
可整合
可维护
学习成本高
文档全
持续更新
流行
五星
MVEL
使用表达式语言定义规则
灵活,性能高,无类型限制
资料少
Github更新少
三星
Easy Rules
使用表达式语言定义规则
易学,基于POJO,支持复合规则,方式多样
Github维护者少
最新版本今年4月发布
四星
Aviator
各种表达式的动态求值
高性能;轻量级;支持多种类型
Github维护者少
资料齐,例子多
四星
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等语句,没有赋值语句,仅支持逻辑表达式、算术表达式、三元表达式和正则匹配,没有位运算符。
到此,相信大家对“Java规则引擎有什么优点”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/93205.html