Kogito,ergo规则—第2部分:规则的全面执行模型

这是第二后 一系列更新的Kogito主动性和我们的努力,使Drools的云。 在这篇文章中,我们将深入研究规则单元的细节,并向您展示为什么我们对它们感到兴奋。

规则的全包执行模型

如果您一直在仔细检查Drools手册,以在每个最新发行版中寻找新功能,则您可能已经注意到,该术语
统治部队已经坐在那里一段时间,这是一项极为实验性的功能 。 简而言之,规则单元既是规则的模块又是执行单元 —之所以不称其为模块是为了避免与JVM模块混淆。 在Kogito,我们正在重新研究并扩展我们的原始原型。

规则单元收集一组规则以及对该规则所作用的工作存储器的描述。 工作存储器的描述被编写为带有DataSource字段的常规Java类。 每个数据源代表工作存储器的类型分区 ,并且存在具有不同功能的不同类型的数据源。 例如,在下面的示例中,我们使用了仅附加数据源,称为
数据流。

public class MonitoringService implements RuleUnitMemory {private final DataStream<Event> events = DataSource.createStream();private final DataStream<Alert> alerts = DataSource.createStream();
}

给定规则单元的规则与单元声明一起收集在DRL文件中

package org.kie.kogito.rules.alerting
unit MonitoringService
rule IncomingEvent when// matches when a temperature higher than 30 °C is registered (OOPath syntax)$e : /events # Temperature[ value >= 30 ] // Temperature is an Event subclass
thenSystem.out.println("incoming event: "+ $e.getMessage());alerts.append( new WarningHighTemperature($e) );
end

单位中的每个规则对相应类中已声明的所有数据源具有可见性。 实际上,一个单元的类和DRL文件的集合构成一个整体 :您可以将这样的整体视为
一个单一的 ,其中字段全局范围内的全局变量方法规则 。 实际上,字段的使用取代了DRL全局变量的使用。

规则单元被提交给调度程序执行 规则单元可以决定产生其执行给其他单位的规则,有效地将其付诸实施。 例如:

rule IncomingEvent when// matches when a temperature higher than 30 °C is registered (OOPath syntax)$e : /events # Temperature[ value >= 30 ] // Temperature is an Event subclass
then// Suspend execution of this unit, yield to the HighTemperatureUnitHighTemperatureUnit.createInstance(events).run(); 
end

但是规则单元也可能处于长期运行状态 。 在这种情况下,
其他规则单元可以同时在同一时间运行; 由于可以跨单元共享数据源,因此可以通过交换消息来协调单元。

考虑以下示例:

package org.kie.kogito.rules.alerting
unit MonitoringService
rule IncomingEvent when// matches when a temperature higher than 30 °C is registered (OOPath syntax)$e : /events # Temperature[ value >= 30 ] // Temperature is an Event subclass
thenSystem.out.println("incoming event: "+ $e.getMessage());alerts.append( new WarningHighTemperature($e) );
end

规则单元以某种方式充当交换消息的“参与者” 。 但是,以一种非常独特的方式,规则单元允许执行更复杂的执行链,这适合基于规则的推理。 例如,
考虑一下Akka手册中的示例

override def receive: Receive = {case RecordTemperature(id, value) =>log.info("Recorded temperature reading {} with {}", value, id)lastTemperatureReading = Some(value)sender() ! TemperatureRecorded(id)case ReadTemperature(id) =>sender() ! RespondTemperature(id, lastTemperatureReading)}

如您所见,Akka中的模式匹配严格只针对单个消息 。 这并不奇怪,因为参与者一次处理一条消息。 在规则引擎中,我们可以编写几条规则,在执行时对工作内存整个状态做出反应:这明显不同于纯粹的参与者模型设计,但同时在创建时提供了很大的灵活性。您可以编写应用程序的业务逻辑的方式。

数据源

值得在数据源上花一些时间。 数据源构造可以看作是对传统工作内存的分区抽象 。 将提供不同种类的数据源:功能齐全的数据存储区可能支持添加,删除和更新值,从而允许在工作内存上进行更传统的操作; 而受更严格限制的仅追加数据流将更易于与外部数据源和数据接收器(例如Camel连接器)集成。 这样的约束对于启用更高级的用例(例如并行,线程安全的执行
OpenShift集群的各个节点之间持久共享通道 (例如:Kafka),实现了完全分布式的规则引擎。

Kogito:ergo Cloud

并行和分布式用例很有趣 ,但是我们需要一步步走到那里 但是,这并不意味着第一步不会像以自己的方式那样令人兴奋。

对于Kogito,我们要强调云原生的无状态用例,其中
控制流程使用流程进行了外部 化,并借助
Quarkus我们可以将其编译为超快速的本机二进制文件。 因此,我们将在接下来的几周内完成并发布规则单元 自动化REST服务实施

在此用例中, 规则单元的基于Java的类型化声明为
自动映射到REST端点的签名。 POST到端点意味着实例化该单元,将数据插入数据源,触发规则,返回响应有效负载。 使用用户提供的查询来计算响应。 例如,考虑以下示例:

package org.kie.kogito.rules.alerting
unit MonitoringService
query Alerts(Alert alert) alert := /alerts # Warning // select all sub-type Warning
end

用户可以使用自动生成的/ monitoring-service端点发布事件。回复将是查询的结果。 在我们的情况下:

{"events": [ { "type": "WarningHighTemperature", "value": 40, "timestamp": "2019-07-12T18:25:45.000Z" }]
}

答复将是查询的结果。 在我们的情况下:

{"events": [ { "type": "Temperature", "value": 10, "timestamp": "2019-07-12T18:25:43.000Z" },{ "type": "Temperature", "value": 25, "timestamp": "2019-07-12T18:25:44.000Z" },{ "type": "Temperature", "value": 40, "timestamp": "2019-07-12T18:25:45.000Z" }]
}

多云,有规则

我们已经提出了我们在Kogito以及以后的下一代规则引擎的愿景。 无状态用例只是迈向迈向规则引擎真正创新之举的第一步。 在接下来的几个月中,我们将努力为并行(本地)和分布式(在Openshift上)分布式单元的调度和部署提供更好的支持,敬请期待。 同时,我们确实希望听到您关于我们正在采取的方向的信息。

翻译自: https://www.javacodegeeks.com/2019/08/kogito-ergo-rules-encompassing-execution-model.html

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

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

相关文章

pat 乙级 1041 考试座位号(C++)

题目 每个 PAT 考生在参加考试时都会被分配两个座位号&#xff0c;一个是试机座位&#xff0c;一个是考试座位。正常情况下&#xff0c;考生在入场时先得到试机座位号码&#xff0c;入座进入试机状态后&#xff0c;系统会显示该考生的考试座位号码&#xff0c;考试时考生需要换…

Ubuntu16U盘没有不能新建粘贴文件[sdf] Write cache: disabled, read cache: enabled, doesn‘t support DPO or FUA

Ubuntu16.04U盘变为只读&#xff0c;不可写入 之前博客记录了Ubantu18下U盘只读的问题&#xff0c;Ubuntu16错误与18不同&#xff0c;故在此记录 1首先参考了这个方法 可是没有解决。。。 https://blog.csdn.net/slj_win/article/details/50349976 但是起码知道了 排错&#x…

1042 字符统计(PAT乙级、C++)(超详细)

题目 请编写程序&#xff0c;找出一段给定文字中出现最频繁的那个英文字母。 输入格式&#xff1a; 输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成&#xff0c;至少包含 1 个英文字母&#xff0c;以回车结束&#xff08;回车…

NS3可视化问题及解决办法

NS Bindings相关问题: 1 NS3编译遇到的Python相关的问题解决办法 ./waf configure --with-pybindgen存放路径 Linux系统在使用时&#xff0c;难免碰到更新忍不住升级软件包&#xff0c;升级软件包有时会带来开发环境的变化&#xff0c;环境的变化就会导致一些编译环境由于版…

使用Angular,Ionic 4和Spring Boot构建移动应用

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 我是Ionic的忠实粉丝。 几年前&#xff0c;我基于AngularJS开始使用它。 作为开发人员&#…

1039 到底买不买(pat乙级、C++)

题目 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告诉她有多少多余的珠子&#xff1…

ns3中调试程序------命令行、gdb和logging系统

1、在调试代码时候&#xff0c;一直没有弄明白NS_LOG中的各种函数是如何使用的&#xff0c;甚至现在运行程序只知道&#xff0c;./waf –run&#xff0c;至于输出调试信息&#xff0c;现在真的是没有弄明白&#xff0c;不利于代码的理解和调试。 2、通过命令行&#xff0c;改变…

1043 输出PATest(PAT乙级 C++)

题目 给定一个长度不超过 10​4的、仅由英文字母构成的字符串。请将字符重新调整顺序&#xff0c;按 PATestPATest… 这样的顺序输出&#xff0c;并忽略其它字符。当然&#xff0c;六种字符的个数不一定是一样多的&#xff0c;若某种字符已经输出完&#xff0c;则余下的字符仍…

ModuleNotFoundError: No module named ‘apt_pkg‘

原因 升级到python3.6会导致python库的引用产生混乱 解决方法 先选择删除python-apt apt-get remove --purge python-apt 安装python-apt apt-get install -f -y python-apt 拷贝python3.5的apt-pkg*.so 名重名为python3.6的apt-pkg*.so cd /usr/lib/python3/dist-packag…

使用Selenium Webdriver进行全屏截图

在任何网页测试人员中&#xff0c;执行效果最好的操作之一就是对网页进行截图。 每当测试人员发现并报告错误时&#xff0c;如果不支持该问题的屏幕截图甚至视频&#xff0c;就不会认真对待该错误。 不论您进行的测试类型是什么&#xff0c;包括硒自动化测试&#xff0c;都是如…

子进程 已安装 post-installation 脚本 返回错误状态 1 dpkg: 依赖关系问题使得 mysql-server 的配置工作不能继续: mysql-server 依赖于 mysq

错误概述 有 2 个软件包没有被完全安装或卸载。 解压缩后会消耗 0 B 的额外空间。 您希望继续执行吗&#xff1f; [Y/n] y 正在设置 mysql-server-5.7 (5.7.24-0ubuntu0.16.04.1) ... mysql_upgrade: Got error: 2002: Cant connect to local MySQL server through socket /va…

1046 划拳 PAT乙级(C++)

题目 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就赢了&#xff0c;输家罚一杯酒。两人同赢或两人同输则继续下一…

只读副本和Spring Data第4部分:配置只读存储库

以前&#xff0c;我们在同一应用程序中设置了两个EntityManager。 一种用于读取&#xff0c;另一种用于写入。 现在是时候创建我们的读取存储库了。 只读存储库将使用辅助只读EntityManager。 为了使其成为只读存储库&#xff0c;至关重要的是不要执行任何保存和持久操作。 p…

c++中 int, long long, double 等数据类型的长度及范围整理

先附上一个比较直观的表&#xff0c;长度表示字节: byte: 字节 bit: 位 1. 短整型short&#xff1a; 所占内存大小&#xff1a;2byte16bit&#xff1b; 所能表示范围&#xff1a;-32768~32767&#xff1b;(即-2^15~2^15-1) 2. 整型int&#xff1a; 所占内存大小&#xff1a;4…

1044 火星数字 PAT乙级 (C++)

题目 火星人是以 13 进制计数的&#xff1a; 地球人的 0 被火星人称为 tret。地球人数字 1 到 12 的火星文分别为&#xff1a;jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的 12 个高位数字分别称为&#xff1a;tam, hel, maa, huh, tou, …

怎样编写测试类测试分支_编写干净的测试–从配置开始

怎样编写测试类测试分支很难为干净的代码找到一个好的定义&#xff0c;因为我们每个人都有自己的单词clean的定义。 但是&#xff0c;有一个似乎是通用的定义&#xff1a; 简洁的代码易于阅读。 这可能会让您感到有些惊讶&#xff0c;但我认为该定义也适用于测试代码。 使测试…

python 数据处理----读取txt 一列数据写入excel 文件

将txt数据从某一行开始写入excel文件中&#xff08;例子为从Appthroughput写至excel_result1.xlsx中&#xff09; import sys import random import time import xlwt import codecsdef Txt_to_Excel(wb,inputTxt,start_row,start_col):fr codecs.open(inputTxt,r)line_numbe…

CCF CSP 201403-1 相反数(C++)

题目 问题描述 有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。 输入格式 第一行包含一个正整数 N。(1 ≤ N ≤ 500)。   第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。 输出…

硒等待:内隐,外显,流利和睡眠

Selenium等待页面加载在Selenium脚本中起着重要的作用。 它们有助于使它们不易剥落&#xff0c;更可靠。 Selenium提供多次等待&#xff0c;以根据某些条件在脚本执行中提供足够的等待或暂停。 从而确保您在使用Selenium执行自动化测试时不会导致脚本失败。 在本教程中&#xf…

python多个变量的for循环

当for循环有两个需要迭代的对象时&#xff0c;要用zip对这多个变量封装&#xff0c;否则会报错“too many values to unpack” 错误的例子&#xff1a; starts [0,1,2,3,4]ends [5,6,7,8,9]for start, end in starts, ends:print((start, end)) 正确的例子&#xff1a; sta…