Drools用户手册翻译——第三章 构建,部署,应用和运行(五)可执行规则模型

news2024/11/23 11:45:45

这应该是Drools的新东西,我之前使用的时候都没注意到还有这么一个东西,据说是可以让Drools变得更高更快更强,这里面有比较详细的介绍,感兴趣就去来看看。

甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。

 

目录

可执行规则模型

在Drools项目中修改或者停用可执行模型

当升级到7.39版本的Drool时,启用可执行规则模型


可执行规则模型

在Drools中规则素材默认使用标准的kie-maven-plugion插件从可执行的规则模型构建。可执行规则模型是嵌入式模型,可执行模型在执行构建时,提供了一套基于java的规则集的表示。可执行模型和Drools之前版本相比,是一个更高效的选择,可以使KieContainer和KieBase更快的被创建出来,尤其是当你有一个DRL文件和其他Drools素材的大列表时。

如果你不使用kie-maven-plugin插件,或者如果你的项目中缺少需要的drools-model-compiler依赖,那么规则素材是在没有可执行模型的情况下构建的。因此,为了在构建期间产生可执行模型,要确保你项目中的pom.xml文件中添加了kie-maven-plugin插件和drools-model-copmiler依赖。

从Drools8.33开始,如果你的项目有drools引擎或者drools规则单元引擎依赖,你不需要添加drools-model-compiler依赖就可以使用kie-maven-plugin插件去生成可执行模型。

可执行模型的优势:

编译期:传统的,一个Drools项目的包包含了DRL文件和其他工件的列表,这些文件和工件定义了规则库,和一些实现了约束和结果的提前生成的类。当KJAR被从Maven仓库中下载并在KIEContainer中被安装时,那些DRL文件必须被解析和编译。这个过程会慢一些,尤其是规则集很大的时候。使用可执行模型,你可以在KJAR内部打包那些实现了项目规则库的可执行模型的Jave类,并以更快的方式重新创建KIEContainer和他的KieBase。在Maven项目里,你使用kie-maven-plugin插件在编译过程中,从DRL文件中去自动生成可执行模型的源代码。

运行时:在可执行模型中,所有的约束都是用java的lambda表达式定义的。相同的lambda表示也可以用于约束计算,所以你不再需要为了解释求值使用mvel表达式,也不需要使用JIT过程将基于mvel的约束转换成字节码。这样创造了一个更快更有效的运行时间。

开发期:可执行模型可以让你使用Drools的新特性去开发和实验,而不需要以DRL形式编码或者修改DRL解析器。

对于在可执行规则模型的查询定义,最多只能设置10个参数。

对于在可执行规则模型中规则结果中的变量,最多可以设置24个变量(包括drools的内置变量)。举例来说,下面的规则结果使用了超过24个变量,造成了编译错误:

then

$input.setNo25Count(functions.sumOf(new Object[]{$no1Count_1, $no2Count_1, $no3Count_1, ..., $no25Count_1}).intValue());

$input.getFirings().add("fired");

update($input);

在Drools项目中修改或者停用可执行模型

使用kie-maven-plugin插件默认从可执行规则模型构建Drools中的规则素材。可执行模型比Drools之前版本的标准素材打包更高效。但是,如果需要,你可以修改或者停用可执行规则模型,以将Drools项目构建作为基于DRL的KJAR,而不是默认的基于模型的KJAR。

过程

使用通常的方式构建Drools项目,但是根据项目的类型提供了备用的构建选项:

  • 对于Maven项目,用命令终端打开maven项目所在的文件夹,然后运行下面的命令:

mvn clean install -DgenerateModel=<VALUE>

用下面的三个值中的一个代替命令中的<VALUE>:

  • YES_WITHDRL:(默认)生成原项目DRL文件对应的可执行模型,DRL文件也要添加到生成的KJAR中做留档(不管怎么说,KieBase是从可执行模型被构建的)。
  • YES:生成原项目DRL文件对应的可执行模型,DRL文件不放入生成的KJAR。
  • NO:不生成可执行模型。

构建命令去停用默认执行模型的行为的例子:

mvn clean install -DgenerateModel=NO

对于以java编程方式配置的应用,可执行模型默认就是停用的。添加规则素材到KIE虚拟的文件系统KieFileSystem,并使用KieBuilder的下面方法之一:

  • buildAll()(默认)或者buildAll(DrlProject.class):不生成可执行模型。
  • buildAll(ExecutableModelProject.class):生成原项目DRL文件对应的可执行模型。

启用可执行模型的例子代码:

import org.kie.api.KieServices;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieBuilder;

  KieServices ks = KieServices.Factory.get();
  KieFileSystem kfs = ks.newKieFileSystem()
  kfs.write("src/main/resources/KBase1/ruleSet1.drl", stringContainingAValidDRL)
  .write("src/main/resources/dtable.xls",
    kieServices.getResources().newInputStreamResource(dtableFileStream));

  KieBuilder kieBuilder = ks.newKieBuilder( kfs );
  // Enable executable model
  kieBuilder.buildAll(ExecutableModelProject.class)
  assertEquals(0, kieBuilder.getResults().getMessages(Message.Level.ERROR).size());

当升级到7.39版本的Drool时,启用可执行规则模型

从Drools7.39开始,使用标准kie-maven-plugin插件默认是从可执行规则模型构建规则素材。可执行模型是比以前Drools的标准素材包更高效的选择。

当你安装Drools7.39时,这个默认执行模型的行为会对所有新项目配置。但是如果你从一个以前版本升级到7.39版本,并且没有启动可执行规则模型,你必须添加需要的依赖到该项目,好让你可以用可执行模型去构建规则素材。如果你没有使用kie-maven-plugin插件或者需要的drools-model-compiler依赖没有添加,规则素材的构建依旧不会使用可执行模型。

想要了解更多关于可执行的规则模型的信息,可参考:

https://docs.drools.org/8.40.0.Final/drools-docs/drools/KIE/index.html#executable-model-con_packaging-deploying。

过程

在你的Maven项目中的pom.xml文件或者你的Java项目的相关类路径上,添加下面依赖,使得规则素材默认从可执行文件构建:

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-model-compiler</artifactId>
    <version>${drools.version}</version>
</dependency>

这个依赖将可执行模型编译成Drools内部数据结构,这样就可以通过Drools的规则引擎去执行了。

<version>是maven工件的版本号(举个例子,7.59.0.Final)。

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

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

相关文章

N天爆肝数据库——MySQL(4)

本篇文章&#xff0c;主要对多表查询&#xff0c;事务以及体系结构进行知识总结和学习。 期待和大家一起学习进步。标量子查询 子查询返回的结果是单个值&#xff08;数字、字符串、日期等&#xff09;&#xff0c;最简单的形式&#xff0c;这种子查询称标量子查询。常用的操作…

面试题更新之-DOCTYPE html相关问题

文章目录 <!DOCTYPE html>是什么&#xff1f;为什么要在html文件开头加上一个<!DOCTYPE html>DOCTYPE的作用&#xff0c;严格与混杂模式的区别&#xff0c;有何意义HTML5为什么只需要写<!DOCTYPE HTML> 是什么&#xff1f; 是HTML文档的文档类型声明&#xf…

SpringSecurity--权限管理架构介绍

目录 介绍 认证 授权 解决⽅案 Shiro 开发者⾃定义 Spring Security 整体架构 认证 AuthenticationManager&#xff08;认证管理器&#xff09; Authentication SecurityContextHolder 授权 AccessDecisionManager AccessDecisionVoter ConfigAttribute 总结 …

Python在安装包时出现ValueError: check_hostname requires server_hostname和Read timed out

一、ValueError: check_hostname requires server_hostname 出现这个问题基本上是因为开了vpn等网络代理软件造成&#xff0c;关掉代理软件即可解决。 二、Read timed out 在安装python包的时候&#xff0c;出现 Read timed out. 尽管添加了镜像源头py.ini&#xff0c;也添加…

游戏程序员的核心竞争力是什么?

看了题主的描述。你的心迷离&#xff0c;仿佛躲避着梦想的曙光&#xff0c;然而在那一片昏暗的迷雾背后&#xff0c;隐藏的不过是懒散的借口。 编程技能 编程语言掌握&#xff1a; C&#xff1a;C是游戏开发中最常用的编程语言之一。了解C的核心语法、面向对象编程和泛型编程…

使用 jmeter 进行审批类接口并发测试

目录 前言&#xff1a; 背景&#xff1a; 难点&#xff1a; 场景 a&#xff1a; 场景 b&#xff1a; 前言&#xff1a; 使用JMeter进行审批类接口的并发测试是一种有效的方法&#xff0c;可以模拟多个用户同时对接口进行审批操作&#xff0c;以评估系统在高负载情况下的性…

APP开发中的数据安全:你需要知道的一切

APP开发中的数据安全&#xff0c;是指 APP开发过程中&#xff0c;所有的数据都会经过严格的安全处理。因为目前 APP开发公司的技术、资质良莠不齐&#xff0c;很多企业在开发过程中不注重对数据安全的保护。 在如今大数据时代&#xff0c; APP开发过程中&#xff0c;会产生大量…

2023-7-14-第十九式中介者模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

linux history 命令 ssh log

history命令可以查看最近Linux中执行的命令。 一、history常用命令 1 2 3 4 history n# 只显示最近的 n 条历史记录 history -c# 清除缓存区中的历史记录 history -w# 将缓存区的历史记录保存到文件 history -d N# 删除第 N 条历史记录 比如# 查看最近的5条命令 1 2 3 4 5 …

【DC-DC】AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式,高效率、外围简单、内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度降压LED恒流驱动芯片。最大电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&…

定西扶贫惠农推介系统(ssm+jsp+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的定西扶贫惠农推介系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java …

21.JavaWeb-RBAC访问控制模型

1.RBAC RBAC&#xff08;Role-Based Access Control&#xff09;是一种基于角色的访问控制模型&#xff0c;用于管理系统中的权限控制。它是一种广泛应用的访问控制策略&#xff0c;可以确保用户只能访问其所需的资源&#xff0c;从而保证系统的安全性和完整性。 RBAC核心是将…

连接一个JavaScript文件

● 首先&#xff0c;本章我们会使用一个起始文件&#xff0c;代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

LAXCUS分布式操作系统存在的意义和价值

总有一些新用户不能理解LAXCUS分布式操作系统&#xff0c;以及它存在的意义和价值&#xff0c;我这样说吧。 下图是一个图形桌面&#xff08;LAXCUS的图形桌面&#xff0c;不是Windows、也不是Macintosh&#xff09;&#xff0c;在它后面&#xff0c;连着一个计算机集群&#…

阿里云无影云电脑价格_企业办公型1元_云桌面入口

阿里云无影云电脑配置费用&#xff0c;4核8G企业办公型云电脑可以免费使用3个月&#xff0c;无影云电脑地域不同费用不同&#xff0c;无影云电脑是由云桌面配置、云盘、互联网访问带宽、AD Connector、桌面组共用桌面session等费用组成&#xff0c;阿里云百科分享阿里云无影云电…

列表状态值转换,状态码对应文字处理

项目中经常遇到&#xff0c;在新增及编辑的时候&#xff0c;我们根据下拉框选择状态时候&#xff0c;在列表或者详情&#xff0c;我们得根据状态码/值&#xff0c;显示对应的文字&#xff0c;这时候&#xff0c;我们就需要对值进行格式处理&#xff0c;效果如下&#xff1a; 我…

【Element】el-dialog 内使用 el-image 并添加 preview-src-list 预览,拖拽导致图片预览不完整问题

现象 el-dialog 内使用 el-image 并添加 preview-src-list 预览&#xff0c;拖拽导致图片预览不完整 <el-dialogwidth"500"v-model"visible":title"activeProp?.name"close"handleClose":draggable"true" // 可拖拽al…

归并排序与计数排序

目录 1.什么是归并排序 2.归并排序的实现 3.归并排序的非递归实现 4.计数排序 1.什么是归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的 分治&#xff08;divide-and-conquer&#xff09;策略 &…

服务保护 Sentinel

服务保护 Sentinel Sentinel 介绍Sentinel 的下载使用Sentinel 流控规则流控规则介绍流控规则演示 Sentinel 热点规则Sentinel 隔离和熔断降级Feign 整合 Sentinel线程隔离熔断降级 Sentinel 授权规则Sentinel 系统规则Sentinel 自定义异常Sentinel 资源定义url 默认资源抛出异…

Linux常用命令——emacs命令

在线Linux命令查询工具 emacs 功能强大的全屏文本编辑器 补充说明 emacs命令是由GNU组织的创始人Richard Stallman开发的一个功能强大的全屏文本编辑器&#xff0c;它支持多种编程语言&#xff0c;具有很多优良的特性。有众多的系统管理员和软件开发者使用emacs。 语法 e…