drools 执行函数_Drools可执行模型还活着

drools 执行函数

总览

可执行模型的目的是提供规则集的纯基于Java的表示,以及方便的Java DSL以编程方式创建这种模型。 该模型是低级的,旨在为用户提供所需的所有信息,例如用于索引评估的lambda。 这样可以使其保持快速运行,并避免在此级别上进行过多的假设。 预计将来会有更高层次的表示形式出现,这可能会更加注重最终用户。 这项工作还高度补充了单元工作,它提供了一种面向Java的方式来提供数据和控制流程。

细节

该模型具有足够的通用性,可以独立于Drools,但可以编译为一个普通的Drools知识库。 因此,可执行模型的实现已分为两个子项目:

  1. drools-canonical-model是完全独立于Drools的规则集模型的规范表示
  2. drools-model-compiler将规范模型编译为Drools内部数据结构,使其可由引擎执行

可执行模型的引入在不同领域带来了一系列好处:

  • 编译时间 :在Drools 6中,一个kjar包含了drl文件和其他Drools工件的列表,这些工件定义了规则库以及一些实现约束和后果的预先生成的类。 从Maven存储库下载kjar并将其安装在KieContainer中时,需要从头开始解析和编译这些drl文件,这使得此过程非常缓慢,尤其是对于大型规则集。 相反,现在可以在kjar中封装实现项目规则库的可执行模型的Java类,并以更快的方式从中重新创建KieContainer及其KieBases。 kie-maven-plugin在编译过程中会自动从drl文件生成可执行模型源。
  • 运行时 :在可执行模型中,所有约束都定义为Java Lambda表达式。 相同的lambda也用于约束评估,这可以避免使用mvel进行解释性评估,也无需使用吉特流程来转换基于mvel的字节码约束,从而导致预热过程缓慢。
  • 未来的研究 :可执行模型将允许试验规则引擎的新功能,而无需以drl格式编码它们并修改drl解析器以支持它们。

可执行模型DSL

在为可执行模型设计DSL的第一个迭代时,一个目标是摆脱模式的概念,并将规则视为表达式(约束)和动作(结果)的流。 因此,我们将其称为Flow DSL。 此DSL的一些示例在此处提供 。

但是,在实施Flow DSL之后,很明显,避免显式使用模式的决定使我们不得不实施一些既具有复杂性又具有性能成本的额外逻辑 ,因为为了正确地重新创建模型期望的数据结构, Drools编译器有必要将那些看似无关的表达式组合在一起。

因此,已经决定在第二个DSL中重新引入模式,我们称之为模式DSL 。 这允许绕过该算法将必须填充人为的语义空白的表达式分组,并且在运行时也很耗时。

我们认为两种DSL都适用于不同的用例,然后我们决定保留并支持这两种。 特别是Pattern DSL更安全,更快速(即使更冗长),因此这是在通过kie-maven-plugin创建kjar时将自动生成的DSL。 相反,Flow DSL更为简洁,更接近于用户希望以编程方式定义Java规则的方式,我们计划通过后处理器自动生成定义模型的模型部分,从而使其不再那么冗长。索引和属性React性。 换句话说,我们期望模式DSL将由机器编写,流DSL最终将由人编写。

程序化构建

如上一节中链接的测试用例所证明的那样,可以用Java以编程方式定义一个或多个规则,然后使用流畅的API将它们添加到模型中。

Model model = new ModelImpl().addRule( rule );

一旦有了这个模型,该模型完全独立于Drools算法和数据结构,便可以按照以下方法创建一个KieBase

KieBase kieBase = KieBaseBuilder.createKieBaseFromModel( model );

或者,也可以通过从普通的drl文件开始将其创建为基于可执行模型的kieproject,并像往常一样将它们添加到KieFileSystem中。

KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem().write( "src/main/resources/r1.drl", createDrl( "R1" ) );
KieBuilder kieBuilder = ks.newKieBuilder( kfs );

然后使用新的buildAll()方法重载来构建项目,该方法接受一个类,该类指定要构建的项目类型

kieBuilder.buildAll( ExecutableModelProject.class );

这样做,KieBuilder将生成可执行模型(基于Pattern DSL),然后生成结果KieSession

KieSession ksession = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()).newKieSession();

如本文档第一部分所述,它将与基于lambda表达式的约束一起使用。 同样,通过将不同的项目类传递给KieBuilder,也可以从Flow DSL生成可执行模型。

kieBuilder.buildAll( ExecutableModelFlowProject.class );

但是,对于讨论2种不同DSL时所解释的内容,为此目的最好使用基于模式的。

Kie Maven插件

为了使用kie-maven-plugin生成嵌入可执行模型的kjar,有必要在pom.xml文件中添加与实现模型及其编译器的两个先前提到的项目相关的依赖项:

<dependencies><dependency><groupId>org.drools</groupId><artifactId>drools-model-compiler</artifactId></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-canonical-model</artifactId></dependency>
</dependencies>

还将插件添加到插件部分

<build><plugins><plugin><groupId>org.kie</groupId><artifactId>kie-maven-plugin</artifactId><version>${project.version}</version><extensions>true</extensions></plugin></plugins>
</build>

这里提供了已经准备好生成可执行模型的pom.xml文件的示例。 默认情况下,kie-maven-plugin仍会生成基于drl的kjar,因此必须使用以下参数运行插件:

-DgenerateModel=<VALUE>

其中<VALUE>可以是三个值之一:

YES
NO
WITHDRL

YES和WITHDRL都将使用实现与原始项目中的drl文件相对应的可执行模型的Java类来生成Java并将其添加到kjar,不同之处在于第一个将从生成的kjar中排除drl文件,而第二个还将添加它们。 但是,在第二种情况下,由于无论如何,KieBase都是从可执行模型构建的,因此drl文件将仅起文档作用。

未来发展

如预期的那样,下一个目标是使DSL(尤其是流量)更加用户友好,尤其是使用后处理器生成可以自动推断的所有部分,例如与索引和属性React性有关的部分。

从可执行模型的角度来看,我们特别通过在规则单元上完成的工作改进了规则的模块化和编排。围绕pojo-ification的重点补充了围绕纯Java DSL的研究方向,并且我们已经有了一些简单的示例 , 说明了如何将可执行模型和规则单元可以混合使用。

翻译自: https://www.javacodegeeks.com/2018/02/drools-executable-model-alive.html

drools 执行函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vim 底行命令模式的正则表达式(匹配模式)

文章目录一、vim 替换表达式的语法格式二、vim 关于 range 的表达式三、vim 关于 flags 的元字符四、vim 关于数量的元字符五、环视和固化分组六、vim 替换表达式的示例&#xff08;一&#xff09;结合 copy 命令使用&#xff08;二&#xff09;结合 move 命令使用&#xff08;…

navicat模型显示注释_RetinaNet模型构建面罩检测器

字幕组双语原文&#xff1a;如何使用RetinaNet模型构建面罩检测器英语原文&#xff1a;How to build a Face Mask Detector using RetinaNet Model!翻译&#xff1a;雷锋字幕组&#xff08;李珺毅&#xff09;介绍目标检测是计算机视觉中一个非常重要的领域&#xff0c;对于自动…

python中parse.add_argument()简单用法

argparse模块简单使用流程以及与命令行的交互1.导入模块2.创建解析器3.添加参数4.解析参数5使用参数完整代码与命令行的交互argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块。下面以例子来简单记下模块使用流程。1.导入模块 import argparse2.创建解析器 该…

java最好学习的方法_学习Java的最佳方法

java最好学习的方法Java是有些人可能说很难学习的语言之一&#xff0c;而其他人则认为它与其他语言具有相同的学习曲线。 两种观察都是正确的。 但是&#xff0c;由于Java具有平台无关性&#xff0c;因此在语言方面具有相当大的优势。 Java是一种低级语言&#xff0c;它以一种…

什么是整数

整数&#xff08;integer&#xff09;是正整数、零、负整数的集合。 整数的全体构成整数集&#xff0c;整数集是一个数环。在整数系中&#xff0c;零和正整数统称为自然数。-1、-2、-3、…、-n、…&#xff08;n为非零自然数&#xff09;为负整数。则正整数、零与负整数构成整数…

镜像电流源特点_模电中的电流源电路

在模电中&#xff0c;电流源电路也称恒流源电路&#xff0c;经常作为放大电路中的偏置电路(即为放大电路提供合适的静态工作点的电路)、有源负载以及电压-电流转换电路等。在一些名牌大学的期末考试或研究生入学考试中&#xff0c;也经常出一道和恒流源相关的题。不同学校的教材…

java改变变量编码方式_Java 10将如何改变您的编码方式

java改变变量编码方式突出显示Java 10中新的Java局部变量类型推断功能 早在2016年&#xff0c;Java社区就掀起了新的JDK增强提案&#xff08;JEP&#xff09;&#xff1a; JEP 286 。 现在&#xff0c;两年后&#xff0c;局部变量类型推断可以说是Java 10中最值得注意的功能。…

vim 批量注释技巧

文章目录一、块选择模式批量注释取消注释二、替换命令批量注释取消注释一、块选择模式 批量注释 Ctrl v 进入块选择模式&#xff0c;然后移动光标选中你要注释的行&#xff0c;再按大写的 I 进入行首插入模式输入注释符号如 // 或 #&#xff0c;输入完毕之后&#xff0c;按 …

深度学习Pytorch--梯度与反向传播笔记

Pytorch梯度与反向传播相关概念导数偏导数方向导数梯度梯度下降法自动求梯度概念Tensor反向传播求梯度相关概念 先来理解一下从导数到梯度的相关概念。 导数 一元函数中导数就是该函数所代表的曲线在这一点上的切线斜率。 多元函数的导数可以称为全导数&#xff0c;可以得到…

工业机器人打磨抛光编程员工资_一种工业机器人打磨抛光工作平台的制作方法...

本实用新型涉及工业机器人领域&#xff0c;具体是一种工业机器人打磨抛光工作平台。背景技术&#xff1a;随着手机的使用量逐年增加&#xff0c;人们对手机外观的要求越来越高&#xff0c;手机壳的打磨和抛光工艺变得越来越严格。由于在拉伸和其他冲压工序中&#xff0c;容易使…

jdk10 换成jdk8_JDK 10的摘要Javadoc标签

jdk10 换成jdk8JDK 10通过发行JDK-8173425 引入了Javadoc标签{summary} &#xff08;“ Javadoc需要一个新标签来指定摘要。”&#xff09;。 这个新标签允许开发人员显式指定Javadoc注释的哪一部分出现在“摘要”中&#xff0c;而不是依靠Javadoc的默认处理来寻找一段时间和空…

深度学习pytorch--线性回归(一)

线性回归线性回归案例提出问题模型定义模型训练(1) 训练数据(2) 损失函数(3) 优化算法模型预测线性回归的表示方法神经网络图矢量计算小结线性回归案例 线性回归输出是一个连续值&#xff0c;因此适用于回归问题。回归问题在实际中很常见&#xff0c;如预测房屋价格、气温、销…

关于 vim 的 magic 设置

文章目录一、magic 介绍二、设置 magic&#xff08;一&#xff09;长效设置&#xff08;二&#xff09;临时设置&#xff08;三&#xff09;magic 示例1. 匹配由 3 个以字母 a 开头&#xff0c;以字母 c 结尾&#xff0c;中间是任意一个字符的子串组成的字符串&#xff08;1&am…

语言逻辑运算符两侧运算对象_5.3 C语言逻辑运算符与表达式

01优先次序 1、有3种逻辑运算符&#xff1a;与&#xff08;AND&#xff09;&#xff0c;或&#xff08;OR&#xff09;&#xff0c;非&#xff08;NOT&#xff09;。在basic和Pascal等语言可以在程序中直接用and&#xff0c;or&#xff0c;not作为逻辑运算符。在C语言中不能再程…

rabbitmq 传递文件_使用RabbitMQ进行消息传递

rabbitmq 传递文件RabbitMQ是一个强大的消息代理&#xff0c;可用于实现不同的消息传递模式。 即使有出色的教程 &#xff08;使用不同的语言和框架&#xff09;&#xff0c;也很难理解这些概念。 在这篇文章中&#xff0c;我想展示一些可以用RabbitMQ实现的不同范例&#xff0…

正则表达式的贪婪模式、非贪婪模式、占有模式

文章目录一、Greediness&#xff08;贪婪型&#xff09;&#xff08;一&#xff09;贪婪模式示例&#xff08;二&#xff09;贪婪模式的匹配过程&#xff08;贪婪模式的回溯&#xff09;二、Reluctant&#xff08;勉强型&#xff09;&#xff08;一&#xff09;非贪婪模式示例&…

深度学习pytorch--线性回归(二)

线性回归无框架实现线性回归的从零开始实现生成数据集(简单的人工构造)读取数据初始化模型参数定义模型定义损失函数定义优化算法训练模型小结完整代码(可直接运行)线性回归的从零开始实现 为了深入理解深度学习是如何工作的&#xff0c;本节不使用强大的深度学习框架&#xf…

乱码 设置界面_和平精英:压轴更新后BUG频出,设置界面崩盘,界面全白变乱码...

引言&#xff1a;陌瑾出品&#xff0c;争做精品&#xff01;大家好&#xff0c;我是你们的老朋友&#xff0c;陌瑾。和平精英作为当下比较热门的一款PVP即时战斗手游&#xff0c;在6月17日&#xff0c;海岛2.0版本也重装上阵&#xff0c;此次地图更新是和平精英游戏上线以来第1…

spring mvc教程_Spring MVC教程

spring mvc教程1.简介 作为企业Java开发人员&#xff0c;这项工作的主要重点之一是开发Web应用程序。 对于Web应用程序&#xff0c;后果还包括许多挑战。 具体来说&#xff0c;其中一些是状态管理&#xff0c;工作流和验证。 HTTP协议的无状态性质只会使事情变得更加复杂。 Spr…

正则表达式实例解读

文章目录正则式 a?正则式 ^\w\d正则式 (\d){4}|\1{2}正则式 \d{4}|\d{2}正则式 a? 正则式&#xff1a;a? 被匹配的字符串&#xff1a;a<>aava</>ab 看下面的 Java 代码&#xff1a; String test "a<>aava</>abb"; String reg "a…