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 执行函数

drools 执行函数_Drools可执行模型还活着相关推荐

  1. 【JS基础】立即执行函数表达式(自执行函数)

    立即执行函数表达式 立即执行函数表达式,大部分人也称为自执行函数. 自执行函数的写法 匿名函数 (function() {console.log(2) })() 具名函数 (function log( ...

  2. Drools可执行模型还活着

    总览 可执行模型的目的是提供规则集的纯基于Java的表示,以及方便的Java DSL以编程方式创建这种模型. 该模型是低级别的,旨在为用户提供所需的所有信息,例如用于索引评估的lambda. 这样可以 ...

  3. html自动执行函数,JS 自执行函数原理及用法

    js自执行函数,听到这个名字,首先会联想到函数.接下来,我来定义一个函数: function aaa(a,b){ return sum = a + b } 定义了一个名为aaa的函数,在里面可以计算两 ...

  4. php批量执行函数,php自动执行函数

    php 动态执行 函数,PHP学习 你的知识信息已经过时了吗? ,php自动执行函数,php的命令执行函数 关键的两个函数: ignore_user_abort(true),这个函数的作用是,无论客户 ...

  5. js 和jQuery(自动执行函数)立即执行函数和页面加载完后执行函数写法

    js 立即执行函数的写法. js 立即执行函数只能用于匿名函数,如果声明了函数名是不可以用立即执行的,通常在函数表达式后加一对小括号()用于立即执行 如果想让函数不被调用的情况下,立即自动执行,需要在 ...

  6. 执行函数_PyCUDA(1)-执行核函数

    本文将介绍如何在GPU上并行地执行一段简单的Hello World代码,并介绍什么是核函数. https://github.com/YouQixiaowu/CUDA-Programming-with- ...

  7. python定时执行函数_python定时执行详解

    知识点 1. sched模块,准确的说,它是一个调度(延时处理机制),每次想要定时执行某任务都必须写入一个调度. (1)生成调度器: s = sched.scheduler(time.time,tim ...

  8. ajax成功后没有执行函数,ajax不执行回调函数

    @吴瑞祥: $.ajax({ type: "POST", url: $("#ScoreInfoTable").attr("EditScoreUrl&q ...

  9. PHP执行命令的函数有,php的命令执行函数

    php 动态执行 函数,PHP学习 你的知识信息已经过时了吗? ,php自动执行函数,php的命令执行函数 PHP 为执行外部命令提供大量函数_历史学_高等教育_教育专区.php基础PHP 为执行外部 ...

最新文章

  1. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置、形状配置)实战
  2. roads 构筑极致用户体验_智美双极 引领旗舰 亚洲龙探索革新的高品质体验
  3. BUUCTF--练习场--Include 1
  4. 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践
  5. 程序员应知道这十大面向对象设计原则
  6. Jsp页面用table表格来让文字和文本框对齐
  7. dubbo 解决既是消费者又是提供者 Duplicate application configs 的问题
  8. 为什么程序员也能成为伟大的CEO
  9. 卸载MySQL安装包
  10. 如何用计算机算回归方程,简单线性回归方程与在线计算器_三贝计算网_23bei.com...
  11. 【图像处理】python实现对图像进行二值化处理
  12. 批处理清空文件夹内所有txt文件的内容
  13. masql函数与存储过程
  14. iphone快捷指令蚂蚁森林能量_iPhone「快捷指令」怎么玩?玩法太多,别让这个功能吃灰...
  15. 高中计算机听课总结,信息技术优质课听课心得体会
  16. Android 编译系统之Android.bp
  17. 【927. 三等分】
  18. PowerShell工具之Powerup详解实录
  19. (50)Linux命令【nl命令】
  20. 我的文档变成英文了怎么办?为什么有的文件夹看起来是中文,但路径却是英文?

热门文章

  1. [Cnoi2019]须臾幻境(LCT维护最大生成树+主席树/分块)
  2. [2020-11-30 contest]数列(矩阵加速),秘密通道(dijkstra最短路)小X游世界树(换根dp),划分(数学)
  3. bzoj#4423-[AMPPZ2013]Bytehattan【并查集】
  4. P6688-可重集【字符串hash,线段树】
  5. P5304-[GXOI/GZOI2019]旅行者【最短路】
  6. 牛客小白月赛17-记录(附题解)
  7. jzoj6311-Mobitel【dp,整除分块】
  8. 中山纪念中学培训15天总结
  9. 动态规划训练14 [Max Sum Plus Plus HDU - 1024 ]
  10. 详解Vue中watch的高级用法