JAVA规则引擎JSR-94笔札
JAVA规则引擎JSR-94笔札
JSR-94 是由JCP(Java Community Process)组织所制定的java规则引擎API的java请求规范。它主要定义了规则引擎在java运行时的一些API,指导各个java规则引擎的厂商能够基于这个API实现规则引擎。当前主流支持这个标准的开源java规则引擎有:Drools、OpenRules、JLisa、JRuleEngine。
什么是规则引擎
JSR-94标准描述的是java规则引擎API,那么什么是规则引擎呢?对于这个问题,业界没有一个严格的定义;当然,这并不妨碍对它的理解。
规则的理解,最简单的一种观点就是规则是一个if/then的单元;满足某种条件,然后执行某些操作。举个典型的例子:本店购买衣服如果金额超过300RMB,那么就享受八折优惠。具体分析这个规则,它需要输入的是本店购买衣服的金额,它需要满足条件是金额超过300RMB,所要做的是结算时候的金额打八折。当然这样可以举上很多例子,又比如本店优惠券100RMB只能用于衣服售价大于300RMB的服装;本店服装售价低于100RMB的服装,直接减免10RMB不享受其他优惠等等,再把这些规则放在一起,我们可以用规则集来称呼它。
规则引擎的理解,继续来分析上面简单的那条规则,对于这条规则的执行它需要输入数据->判别条件 -> 执行操作 -> 输出结果来完成它的功用;如果把这一条规则替换成一个规则集,那么执行就变成 输入数据、规则集合 -> 执行满足规则集 -> 输出结果;这样的执行过程就是规则引擎的一个简单抽象。
当然,规则引擎有很多,它们并非都像以上为了方便理解而简单的抽象,甚至规则引擎之间有很大的差别。总体来说,有以下特点:
- 它提供了一种机制,可以用于扩展业务和程序的逻辑;
- 它有一种特定的文件格式或者工具或者语法形式,用来编辑规则和规则集从而扩展程序;
- 它常伴有输入数据并产生输出结果,往往和程序紧密切合;
最常见的是Forward-chaining类型的规则引擎,而且一般采用的是RETE算法或者相关改进算法来实现。
JSR-94 简略介绍
JSR-94 是由JCP(Java Community Process)组织所制定的java规则引擎API的java请求规范。标准制定开始于14 Nov, 2000,最后于04 Aug, 2004发布当前最终版本。该标准集合了IBM、Oracle、BEA Systems等等各个软件厂商的专家参与制定。它的目的是为了促进规则引擎技术在java程序中的发展;增加java规则引擎厂商之间的的交流以及标准化工作;让使用规则引擎的第三方应用更加方便与规范;也为了简化规则引擎商对外提供的API。
这份标准已被Java规则引擎商广泛采用,得到了认可与支持。
JSR-94 一些概念的定义
Rule(规则)
一般而言,一个规则包含两个部分:条件和操作。当条件满足时,就会执行规则定义的操作。因为提供规则引擎的不同厂商往往规则定义的结构,规则执行的算法不同,所以JSR94标准中不直接定义规则的结构。规则的概念表示的是一个基本单位概念,可作为一个名字或者描述。
Rule Execution Set(规则执行集合)
规则执行集合是指多个规则组成的集合。JSR94也不直接定义规则集合的结构,表示的也只是一个基本单位概念。
Rule Session(规则会话)
Rule Session是指运行时程序与规则引擎之间的连接,一个规则会话会关联一个规则执行集合。一个规则会话,可能会消耗规则引擎的资源,所以当程序不再使用的时候应该释放该会话资源。
Stateful Rule Session(全状态规则会话)
Stateful Rule Session 是指运行程序长时间的同一个规则执行集合进行交互,有记录会话时的相关状态、数据信息。
Stateless Rule Session(无状态规则会话)
Stateless Rule Session 提供的是一种高效、简单的API来执行规则集合,不记录会话时的相关数据信息。
JSR-94 API 的相关设计
JSR-94提供的规则引擎相关类和接口都是放在javax.rules 和 javax.rules.admin 这两个包名下。javax.rules 包主要定义的是规则引擎运行时的相关API,这些API主要提供的是与规则会话直接或者间接相关的API;另外一个javax.rules.admin 包提供的是管理规则执行集合相关的API。总体来看就是一个提供的是规则引擎运行接口,另一个提供的是规则执行集合的管理接口。
规则引擎运行接口,它主要提供了以下的几个功能点:
- 获取规则引擎厂商提供的 RuleServiceProvider 的实现实例;
- 通过 RuleServiceProvider 获取到规则运行时的接口 RuleRuntime;
- 通过 RuleRuntime 来创建 规则会话 RuleSession;
- 获取到注册的相关资源,并且与 RuleSession 进行交互,其中包括规则执行集合的相关内容;
- 执行规则集合,并且提供结果以及进行相关处理;
- 用 Handle 实例来允许数据对象联系到 StatefulRuleSession;
规则执行集合管理接口,主要提供的功能如下:
- 通过 RuleServiceProvider 获取到规则管理的实例 RuleAdministrator;
- 通过一些java中标准的数据结构类来获取规则执行集合 RuleExecutionSet,比如:java.io.InputStream、java.lang.String、org.w3c.dom.Element等等;
- 通过URI来管理 RuleRuntime 的规则执行集合;
- 查询规则执行集合 RuleExecutionSet 中的 Rule 规则;
- set 和 get 应用程序或者引擎厂商的相关特别属性;
最后,不妨用一段代码具体来看JSR94一个无状态规则会话 执行的简化过程:
//获取规则引擎厂商提供的RuleServiceProvider 实例
String uri = RuleServiceProviderImpl.RULE_SERVICE_PROVIDER;
RuleServiceProviderManager.registerRuleServiceProvider(uri, RuleServiceProviderImpl.class);
RuleServiceProvider ruleServiceProvider = RuleServiceProviderManager.getRuleServiceProvider(uri);
//获取RuleAdministrator 和 RuleExectuionSetProvider 实例
HashMap<String, String> properties = new HashMap<String, String>();
RuleAdministrator ruleAdministrator = ruleServiceProvider.getRuleAdministrator();
LocalRuleExecutionSetProvider ruleExecutionSetProvider =
ruleAdministrator.getLocalRuleExecutionSetProvider(properties);
//创建一个 RuleExecutionSet
InputStream inputStream = new ByteArrayInputStream(ruleString.getBytes());
RuleExecutionSet ruleSet = ruleExecutionSetProvider.createRuleExecutionSet(inputStream, properties);
RuleRuntime ruleRuntime = ruleServiceProvider.getRuleRuntime();
ruleAdministrator.registerRuleExecutionSet("isArule", ruleSet, properties);
//创建一个规则会话,并executeRules
StatelessRuleSession ruleSession = (StatelessRuleSession) runtime.createRuleSession("isArule", null,
RuleRuntime.STATELESS_SESSION_TYPE);
ruleSession.executeRules(Arrays.asList(args));
JSR-94 不足之处
JSR94标准规范定义的API比较简单,非常灵活;但是它最大的不足在于缺乏对于规则定义语言的定义。在它发布最终版本之后,W3C组织于2005年发起了一份RIF(Rule Interchange Format )标准定义的讨论,这份标准定义更加详细、严格些,感兴趣可以翻阅相关资料, 5 February 2013已经发布了第二版,不过 公共认可程度 现在还比不上JSR94这份标准。
相关文献链接
JavaTM Rule Engine API
JSR-94 - 维基百科,自由的百科全书
Getting Started With the Java Rule Engine API
Java规则引擎与其API(JSR-94)
Guideline: JSR94 - Eclipse
JSR 94 API API
RIF Overview
编程De 小站
JAVA规则引擎JSR-94笔札的更多相关文章
- Java规则引擎及JSR-94[转]
规则引擎简介 Java规则引擎是推理引擎的一种,它起源于基于规则的专家系统. Java规则引擎将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.Java规则引擎接 ...
- [Drools]JAVA规则引擎 -- Drools- 转http://blog.csdn.net/quzishen/article/details/6163012
[Drools]JAVA规则引擎 -- Drools 标签: java引擎exceptiongetterstringsetter 2011-01-25 14:33 113340人阅读 评论(35) 收 ...
- 【java规则引擎】之规则引擎解释
转载:http://www.open-open.com/lib/view/open1417528754230.html 现实生活中,规则无处不在.法律.法规和各种制度均是:对于企业级应用来说,在IT技 ...
- Java规则引擎 Easy Rules
1. Easy Rules 概述 Easy Rules是一个Java规则引擎,灵感来自一篇名为<Should I use a Rules Engine?>的文章 规则引擎就是提供一种可选 ...
- JAVA规则引擎 -- Drools
Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...
- [Drools]JAVA规则引擎 -- Drools 2
上一篇文章 http://blog.csdn.net/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的 ...
- [Drools]JAVA规则引擎 -- Drools
Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...
- java 规则引擎资料汇集
1. ibm的developworks中较早的一篇关于规则引擎的文章 https://www.ibm.com/developerworks/cn/java/j-java-rules/ 2. 一篇硕士论 ...
- 【java规则引擎】一个基于drools规则引擎实现的数学计算例子
最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎.兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎 ...
随机推荐
- python中for...if...构建List
1.简单的for...[if]...语句 >>> a=[12, 3, 4, 6, 7, 13, 21] >>> newList = [x for x in a] & ...
- php使用ffmpeg向视频中添加文字字幕
这篇文章主要介绍了PHP使用ffmpeg给视频增加字幕显示的方法,实例分析了php操作ffmpeg给视频增加字母的技巧,具有一定参考借鉴价值,需要的朋友可以参考下. 本文实例讲述了PHP使用ffmpe ...
- Linux命令行下如何终止当前程序
Linux命令行下如何终止当前程序 快捷键: Ctrl+c 在命令行下起着终止当前执行程序的作用, Ctrl+d 相当于exit命令,退出当前shell Ctrl+s 挂起当前shell(保护作用很明 ...
- Java平台与内存管理
问题及答案来源自<Java程序员面试笔试宝典>第四章 Java基础知识 4.8Java平台与内存管理 1.为什么说Java是平台独立性语言? 平台独立性是指可以在一个平台上编写和编译程序, ...
- PL/SQL 的一些用法
变量的声明,赋值,打印(declare是pl/sql里面的用法 variable是sql*plus里面的用法,variable相当于一个sql*plus环境的全局变量,declare里定义的是pl/s ...
- linnux-shell知识
awk 是单行处理文本 正则: cat test.py | awk '/a/ {print $1}' # 如果test.py中存在a这个字母,就打印所在行的第一列(注意是该列,不是该词).匹配成功, ...
- uva-10152-乌龟排序
求从待排序的到期望的顺序的最小操作顺序,只能进行一个操作,将当前的乌龟拿出来,上面的下移,拿出来的放到最上面 发现voj没有PE, 解题方法,把俩个串反过来使用,从期望的顺序到待排序的顺序. AC:1 ...
- 手动控制IIS Express的两个常用方法
由于VS在开发WEB应用程序时,每次都需要重新启动IIS Express,速度太慢了,如果改为手动控制IIS Express启动,那么可以直接编译应用程序后,直接刷新页面,那么速度会更快. 因此需要常 ...
- ELK配置过程初次安装使用心得--elasticsearch5.4版--及logstash
安装所遇到的问题:http://www.bubuko.com/infodetail-1889252.html 一,先创建用户和组groupadd es useradd -g es es passwd ...
- 用Redis实现分布式锁 与 实现任务队列【转载】
这一次总结和分享用Redis实现分布式锁 与 实现任务队列 这两大强大的功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意 ...