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);
<pre><code>//&#x83B7;&#x53D6;RuleAdministrator &#x548C; RuleExectuionSetProvider &#x5B9E;&#x4F8B;
HashMap<String, String> properties = new HashMap<String, String>();
RuleAdministrator ruleAdministrator = ruleServiceProvider.getRuleAdministrator();
LocalRuleExecutionSetProvider ruleExecutionSetProvider =
             ruleAdministrator.getLocalRuleExecutionSetProvider(properties);

//&#x521B;&#x5EFA;&#x4E00;&#x4E2A; RuleExecutionSet
InputStream inputStream = new ByteArrayInputStream(ruleString.getBytes());
RuleExecutionSet ruleSet = ruleExecutionSetProvider.createRuleExecutionSet(inputStream, properties);
RuleRuntime ruleRuntime = ruleServiceProvider.getRuleRuntime();

ruleAdministrator.registerRuleExecutionSet("isArule", ruleSet, properties);

//&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x89C4;&#x5219;&#x4F1A;&#x8BDD;&#xFF0C;&#x5E76;executeRules
StatelessRuleSession ruleSession = (StatelessRuleSession) runtime.createRuleSession("isArule", null,
                RuleRuntime.STATELESS_SESSION_TYPE);
ruleSession.executeRules(Arrays.asList(args));
</code></pre>

JSR-94 不足之处

JSR94标准规范定义的API比较简单,非常灵活;但是它最大的不足在于缺乏对于规则定义语言的定义。在它发布最终版本之后,W3C组织于2005年发起了一份RIF(Rule Interchange Format )标准定义的讨论,这份标准定义更加详细、严格些,感兴趣可以翻阅相关资料, 5 February 2013已经发布了第二版,不过 公共认可程度 现在还比不上JSR94这份标准。

相关文献链接

Original: https://www.cnblogs.com/jzhlin/p/4255883.html
Author: Java研究者
Title: JAVA规则引擎JSR-94笔札

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/615899/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简单集成教程

    JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简单集成教程 JS文件在最下面: 引入 html部分 遮盖层 java;gutter:true; 正在导出中请稍后…

    Java 2023年6月5日
    066
  • Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法

    简介:Spring Data JPA 其实就是JDK方式(还有一种cglib的方式需要Class)的动态代理 (需要一个接口 有一大堆接口最上边的是Repository接口来自or…

    Java 2023年5月30日
    061
  • php在大并发下redis锁实现

    在现如今电商盛行的时期,会出现很多促销活动,最为常见的就是秒杀。在秒杀系统中最为常见的问题就是会出现超卖的情况,那么如何来杜绝超卖的情形了,在业务逻辑层面可以使用缓存以及加锁的手法…

    Java 2023年6月8日
    076
  • 详解apollo的设计与使用

    apollo 是一款由携程团队开发的配置中心,可以实现配置的集中管理、分环境管理、即时生效等等。在这篇博客中,我们可以了解到: 这里我回答的是为什么使用配置中心,而不是为什么使用 …

    Java 2023年6月14日
    094
  • kubernetes V1.16 Ingress-nginx部署

    在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes中可以通过Node…

    Java 2023年5月30日
    083
  • nginx重新整理——————http请求的11个阶段中的precontent阶段[十六]

    前言 简单介绍一下precontent阶段。 正文 介绍一下这个阶段的几个模块。 ngx_http_try_files_module 模块。 syntax : tryfiles f…

    Java 2023年5月30日
    059
  • (转)Java atomic原子类的使用方法和原理(一)

    在讲atomic原子类之前先看一个小例子: <span class="hljs-keyword">public <span class=&qu…

    Java 2023年5月29日
    087
  • 4、spring+springMVC+mybaits+idea+maven

    1、构建项目结构如下 2、构建项目中的pom.xml文件中的依赖资源,里面包含ajax和分页插件的依赖哦 1 <?xml version="1.0" en…

    Java 2023年6月13日
    055
  • java算法计算一元一次方程

    java算法计算一元一次方程是昨年10月写的了,最近想写写算法就把它整理出来了。 核心思想是将方程转化为:aX+b = cX+d 的形式再进行计算,转化的思想是根据符号的优先级一层…

    Java 2023年5月29日
    065
  • Maven 快速入门

    一、简介 Maven 是一个用于构建/管理任何基于Java项目的工具,其本身也是基于Java的 因此需要Java环境。其最初是为了简化 Jakarta Turbine 项目的构建而…

    Java 2023年6月6日
    071
  • 应用启动加速-并发初始化spring bean

    背景 随着需求的不断迭代,服务承载的内容越来越多,依赖越来越多,导致服务启动慢,从最开始的2min以内增长到5min,导致服务发布很慢,严重影响开发效率,以及线上问题的修复速度。所…

    Java 2023年6月8日
    072
  • JavaCV的摄像头实战之七:推流(带声音)

    借助JavaCV,完成本地摄像头和麦克风数据推送到媒体服务器的操作,并用VLC验证 欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://gith…

    Java 2023年6月8日
    088
  • Java 将HTML转为XML

    本文介绍如何通过Java后端程序代码来展示如何将html转为XML。此功能通过采用Word API- Free Spire.Doc for Java 提供的 Document.sa…

    Java 2023年5月29日
    065
  • Java之Servlet

    Servlet规范了JavaWeb项目的结构Servlet的规范约束了服务器如何来实现Servlet规范,如何解析JavaWeb项目的结构。 Java就是通过接口来约束 Servl…

    Java 2023年5月29日
    070
  • 游戏协议模拟测试工具(TcpEngine)使用简介

    功能介绍 在有的网络开发需要走二进制流协议场景,比如网络游戏开发,在开发阶段,前端和后端协商好协议后就分别开发。在开发写代码的时候,有时需要对端发送一条完整的协议过来触发一下自己的…

    Java 2023年6月5日
    070
  • 140_SpringBoot案例-fanout发布订阅模式

    整体核心 目标 实现步骤 生产者 创建生产者工程:springboot-rabbitmq-fanout-producer 在pom.xml中引入依赖 在application.ym…

    Java 2023年6月7日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球