Kogito,ergo规则:从知识到服务,轻松自如

欢迎阅读有关Kogito倡议的博客系列的另一集,以及我们将Drools带入云的努力。 这些文章的目的是收集用户对我们提供给Kogito的功能的早期反馈。

在本文中,我们介绍了两种实现完整智能服务的新方法

  1. 独立的规则服务
  2. 集成智能工作流程和规则任务

Kogito的执行单位

您可能已经知道,在Kogito中,我们正在使全新的Unit概念成为中心。

“执行单元”是我们用来表示可执行知识的术语。 一个单元可以是一个过程,一组规则,一个决策等。在一组规则的情况下,我们称其为规则单元 。 如果您选择使用单位,那么在Kogito中,我们将处理自动生成REST端点所需的所有样板。

规则单元主要由

1)数据定义;

2)一组实现单元行为的规则和查询(规则引擎的规则); 3)可选地,可以出于多种目的附加事件侦听器。

在本文中,我们将重点介绍数据定义,规则和查询。

通过声明一个可能包含数据源的Java类来给出数据定义 。 每个数据源代表规则将匹配或插入到其中的工作内存分区。

例如,假设您要声明一个警报服务,该服务接收事件并根据某些条件产生警报。 我们声明
EventAlert对象如下:

 package com.acme;  public class Event { String type; int value; // getters and setters  }  public class Alert { String severity; String message; // getters and setters  } 

AlertingService单元类型声明是实现接口RuleUnitData

 package com.acme;  public class AlertingService implements RuleUnitData { private final DataStream<Event> eventData = DataSource.createStream(); private final DataStream<Alert> alertData = DataSource.createStream(); // getters and setters  } 

规则在DRL文件中照常定义,除了现在必须在文件顶部指示它们的单位 。 例如,您可以声明AlertingService的数据定义,如下所示:

 package com.acme;  unit AlertingService;  rule IncomingEvent when // matches when a temperature higher than 30 °C is registered (OOPath syntax) $e : /eventData [ type == "temperature" , value >= 30 ]  then System.out.println( "incoming event: " + $e.getMessage()); alertData.append( new Alert( "warning" , "Temperature is too high" ) );  end 

如您所见,规则可能与给定的数据源匹配或插入到给定的数据源。

查询是在DRL文件(如规则)中定义的,也属于一个单元。 如果声明至少一个查询,则将免费获得REST端点自动生成 。 例如:

 query Warnings alerts: /alertData [ severity == "warning" ]  end 

将生成REST端点/warnings ,您可以通过以下方式对其进行POST-ing调用:

 $ curl -X POST \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "eventData": [ { "type": "temperature", "value" : 40 } ] }' \ http: //localhost:8080/warnings 

这将生成响应:

 [ { "severity" : "warning" , "message" : "Temperature is too high" } ] 

程序员非常熟悉基于Java的数据定义,但是从用户的早期反馈来看, 我们决定提供两种替代方法来声明规则单元 。 我们正在发布此博客文章,以收集更多的用户反馈!

类型声明

类型声明是DRL功能,用于以与Java无关的方式声明与Java兼容的类型。 在7系列中,用户可以使用以下语法声明类型:

 package com.acme;  declare Event type: String value: int  end  declare Alert severity: String message: String  end 

这使DRL完全独立:可以使用DRL定义实体和规则。 但是,它们没有什么限制。 例如,它们不支持实现接口,也不支持泛型类型字段。 换句话说,以下声明在7系列中在语法上是无效的:

 package com.acme;  declare AlertingService extends RuleUnitData eventData: DataStream<Event> alertData: DataStream<Alert>  end 

在版本0.8.0中,我们解除了这些限制:我们允许接口的继承受限(现在仅允许一个继承),而字段的通用类型声明。 使用这些新功能,以下代码将成为有效的DRL。

长话短说: 您现在可以声明完整的微服务
来自单个DRL

用原型引导您的Kogito服务:

 mvn archetype:generate \ -DarchetypeGroupId=org.kie.kogito \ -DarchetypeArtifactId=kogito-quarkus-archetype \ -DarchetypeVersion= 0.8 . 0 \ -DgroupId=com.acme \ -DartifactId=sample-kogito 

目前,还没有Quarkus版本捆绑Kogito 0.8.0。 否则,您将可以使用mvn io.quarkus:quarkus-maven-plugin:create代替。

现在,清除src/main的内容,然后将此DRL放到src/main/resources/com/acme文件夹中:

 package com.acme;  unit AlertingService;  import org.kie.kogito.rules.DataStream;  import org.kie.kogito.rules.RuleUnitData;  declare Event type: String value: int  end  declare Alert severity: String message: String  end  declare AlertingService extends RuleUnitData eventData: DataStream<Event> alertData: DataStream<Alert>  end  rule IncomingEvent when // matches when a temperature higher than 30 °C is registered (OOPath syntax) $e : /eventData [ type == "temperature" , value >= 30 ]  then System.out.println( "incoming event: " + $e.getMessage()); alertData.append( new Alert( "warning" , "Temperature is too high: " + $e ) );  end  query Warnings alerts: /alertData [ severity == "warning" ]  end 

现在,通过以下方式在开发人员模式下启动Quarkus服务:

 $ mvn compile quarkus:dev 

到此为止,您现在可以curl您的服务了:

 $ curl -X POST \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "eventData": [ { "type": "temperature", "value" : 40 } ] }' \ http: //localhost:8080/warnings 

工作流程整合

公开基于规则的服务的另一种方法是通过工作流

工作流 (有时称为“业务流程”)描述了图中的一系列步骤,并且通常声明变量 :在执行过程中操作的值的数据持有者。 一个这样的变量的数据类型可以是任何东西 :您可以使用Java类,但是在此示例中,我们将再次使用声明的数据类型。

 package com.acme;  declare Event type: String value: int  end  declare Alert severity: String message: String  end 

让我们将此工作流称为com.acme.AlertingWorkflow ,并声明变量eventDataalertData

包含规则任务的工作流可能会完全跳过规则单元的数据声明 :在这种情况下,规则单元是直接从流程的结构中推断出的:每个变量都将插入同名的数据源中

单元的名称由进程使用语法unit:com.acme.AlertingService 。 您仍然可以自由声明单元com.acme.AlertingService ; 在这种情况下,该过程将获取您手工编码的声明。

注意:您可能已经注意到我们正在使用“规则流组”字段。 将来,我们将在UI中实现更明确的支持。

用原型引导您的Kogito服务:

 mvn archetype:generate \ -DarchetypeGroupId=org.kie.kogito \ -DarchetypeArtifactId=kogito-quarkus-archetype \ -DarchetypeVersion= 0.8 . 0 \ -DgroupId=com.acme \ -DartifactId=sample-kogito 

警告 。 该功能的支持是试验性的,因此它可能无法与Quarkus热代码重新加载无缝配合; 我们还需要执行以下额外步骤来启用它,但将来会有所改变。

使用以下插件声明更新pom.xml

 <build> <plugins> <plugin> <groupId>org.kie.kogito</groupId> <artifactId>kogito-maven-plugin</artifactId> <version> 0.8 . 0 </version> <executions> <execution> <goals> <goal>generateDeclaredTypes</goal> </goals> </execution> </executions> </plugin> ... </plugins> </build> 

现在,您可以清除src/main的内容,然后将进程和以下DRL放到src/main/resources/com/acme文件夹中。

 package com.acme;  unit AlertingService;  import org.kie.kogito.rules.DataStream;  import org.kie.kogito.rules.RuleUnitData;  declare Event type: String value: int  end  declare Alert severity: String message: String  end  rule IncomingEvent when // matches when a temperature higher than 30 °C is registered (OOPath syntax) $e : /eventData [ type == "temperature" , value >= 30 ]  then System.out.println( "incoming event: " + $e.getMessage()); alertData.set( new Alert( "warning" , "Temperature is too high: " + $e ) );  end 

您可能已经注意到,不需要显式声明查询:该过程将显示变量的内容作为响应; 它将生成端点/AlertingWorkflow ,并接受以下形式的POST请求:

 $ curl -X POST \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "eventData": { "type": "temperature", "value" : 40 } }' \ http: //localhost:8080/AlertingWorkflow 

答复将是:

 { "id" : ..., "eventData" : { "type" : "temperature" , "value" : 100 }, "alertData" : { "severity" : "warning" , "message" : "Temperature is too high: Event( type=temperature, value=100 )" }  } 

但是,如果您确实声明了查询,那么还将有一个单独的端点。 例如,如果您声明查询“ Warnings您仍然可以POST到http://localhost:8080/warnings并分别调用规则服务,如下所示:

 $ curl -X POST \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "eventData": { "type": "temperature", "value" : 40 } }' \ http: //localhost:8080/warnings 

请注意,该请求不再包含事件列表。 这是因为过程变量映射到单个值而不是DataStreams。

结论

我们偷看了我们正在做的工作,以改进Kogito中的规则和流程的入门经验。 通过这些更改,我们希望提供一种更加简化的方法来定义基于知识的服务。 通过选择编写Java,开发人员将始终能够更加明确地了解他们想要处理的数据。 但是如果他们愿意,他们可以采用完全以DSL为中心的开发工作流程。

对于懒惰者,可以在https://github.com/evacchi/kogito-rules-example/tree/master/code获得示例。

翻译自: https://www.javacodegeeks.com/2020/03/kogito-ergo-rules-from-knowledge-to-service-effortless.html

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

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

相关文章

linux系统io查看计算,Linux下查看进程IO工具iopp

Linux下的IO检测工具最常用的是iostat&#xff0c;不过iostat只能查看到总的IO情况。如果要细看具体那一个程序点用的IO较高&#xff0c;可以使用iotop 。不过iotop对内核版本和Python版本有要求&#xff0c;虽然目前主流的CentOS和Ubuntu版本上都适用。不过考虑到其无法适用的…

java 并发锁_Java并发教程–锁定:内在锁

java 并发锁在之前的文章中&#xff0c;我们回顾了在不同线程之间共享数据的一些主要风险&#xff08;例如原子性和可见性 &#xff09;以及如何设计类以安全地共享&#xff08; 线程安全的设计 &#xff09;。 但是&#xff0c;在许多情况下&#xff0c;我们将需要共享可变数据…

linux 命令 ppt,Linux基本命令()讲解.ppt

第2章 Linux 基本命令 2.1 系统管理命令 在 Linux/UNIX 操作系统中&#xff0c;所有事物都被当作文件来处理&#xff1a;硬件设备(包括键盘和终端)、目录、命令本身&#xff0c;当然还有文件。 实际上是 Linux/UNIX 的能力和灵活性的基础。Linux操作系统命令分为文件管理、文件…

Java14:使用Java 14的新记录联接数据库表

您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中&#xff1f; 阅读这篇简短的文章&#xff0c;并了解如何使用Speedment Stream ORM完成它。 我们将从如何设置您的项目开始。 设定 下载Java 14 。 转到Speedment Initializer并下载您的项目骨架&#x…

linux 读取内存颗粒,Linux虚拟内存地址转化成物理内存地址

背景现代手机这种SOC(system on chip)&#xff0c;因为功耗、Modem等功能soc上集成了很多core,他们还可以是独立的系统在运转。比如ADSP简介ADSP(Application Digital Signal Processing)就是高通的Hexagon DSP ,就是独立运转的一个coresystem。这样做不仅可以使用soc上的专用核…

primefaces_PrimeFaces扩展中的全新JSF组件

primefacesPrimeFaces扩展团队很高兴宣布即将推出的3.0.0主要版本的几个新组件。 我们的新提交者Francesco Strazzullo为该项目提供了“ Turbo Boost”&#xff0c;并带来了至少6个已成功集成的 JSF组件&#xff01; 当前的开发状态是OpenShift上的deployet – 请查看展示柜。以…

linux数字设定法设定权限,Linux chmod命令详解和使用实例(改变文件或目录的访问权限)...

Linux系统中的每个文件和目录都有访问许可权限&#xff0c;用它来确定谁可以通过何种方式对文件和目录进行访问和操作。文件或目录的访问权限分为只读&#xff0c;只写和可执行三种。以文件为例&#xff0c;只读权限表示只允许读其内容&#xff0c;而禁止对其做任何的更改操作。…

Java 8 Stream中间操作(方法)示例

Java 8 Streams中间操作的完整指南。 所有内置Stream API中间操作&#xff08;方法&#xff09;的列表以及示例。 1.概述 在本教程中&#xff0c;我们将学习什么是 Java 8 Stream 中的中间操作 。 所有这些操作都在java.util.stream.Stream包中 。 在上一教程中&#xff0c;我…

linux服务 运维案例,linux运维实战练习案例-2015年12月20日-12月31日

1、创建一个10G的文件系统&#xff0c;类型为ext4&#xff0c;要求开机可自动挂载至单独数据/data目录&#xff1b;[[email protected] /]# cat /proc/partitionsmajor minor #blocks name8 0 52428800 sda8 1 204800 sda18 2 4096000 sda28 …

使用Quarkus调试容器中的系统测试(视频)

如果您能够借助容器在本地进行端到端测试应用程序&#xff0c;则可以提高开发效率。 在下面的视频中&#xff0c;我将展示如何使用Quarkus在Docker容器中调试本地系统测试。 这是我关于有效测试的视频课程的Quarkus扩展。 要了解全部情况&#xff0c;还可以查看以下资源&…

linux中memcpy实现分析,ARM64 的 memcpy 优化与实现

如何优化 memcpy 函数Linux 内核用到了许多方式来加强性能以及稳定性&#xff0c;本文探讨的 memcpy 的汇编实现方式就是其中的一种&#xff0c;memcpy 的性能是否强大&#xff0c;拷贝延迟是否足够低都直接影响着整个系统性能。通过对拷贝函数的理解可以加深对整个系统设计的一…

ejb生命周期_EJB 3.x:生命周期和并发模型(第2部分)

ejb生命周期这是两部分系列的第二篇。 第一部分介绍了有状态和无状态EJB的生命周期以及并发行为。 我将在本文中介绍Singleton EJB 。 Singleton模式可以说是最常用&#xff08;有时被滥用&#xff01;&#xff09;的模式。 单吨又爱它&#xff01; Java EE使我们无需编写显…

linux修改文件没有备份文件,linux文件或目录权限修改后如何恢复(备份了权限就能恢复)...

操作系统 RHEL5如果你在linux上执行了如下操作chmod -R 777 / 或者 chmod -R 700 /那么恭喜你&#xff0c;你的系统即将崩溃&#xff0c;重启之后&#xff0c;你进不了图形界面&#xff0c;而且很多服务都起不来为什么呢&#xff1f;因为linux中&#xff0c;系统的有些文件和目…

JDK 14 / JEP 305模式匹配“ Smart Casts”实例

我通常将Java代码中instanceof运算符的存在视为“ 红色标志 ”&#xff0c;这意味着在某些情况下使用instanceof不一定是错误的&#xff0c;但是使用它有时表示可以以一种更干净的方式解决设计问题&#xff0c;如所述本文末尾引用的一些资源中的内容&#xff08;包括有关Java以…

linux美化原理,x-window字体原理及美化

x-window字体原理及美化发布时间:2006-10-07 01:25:15来源:红联作者:caldo1. 简介在我必须处理的一堆讨厌事中&#xff0c;有一项就是没完没了的 X 缺省字体和字体设定 (我专指 XFree86&#xff0c;其它的 X 也许比较好)。有些程序缺省使用固定宽度字体 (fixed width fonts)&am…

易流即时配送_即时大数据流处理=即时风暴

易流即时配送在Ubuntu背后的公司Canonical&#xff0c;每6个月进行一次技术工作&#xff0c;以第一手测试我们的工具并向其他人展示新想法。 这次&#xff0c;我创建了一个即时大数据解决方案&#xff0c;更具体地讲是“即时风暴”。 Storm现在是Apache基金会的一部分&#xf…

c语言有参有类最小公倍数,【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数...

程序分析&#xff1a;在数学中&#xff0c;两个数的最小公倍数两个数的乘积/两数的最大公约数。求两个数的最大公约数&#xff0c;运用辗转相除法&#xff1a;已知两个整数M和N&#xff0c;假定M>N&#xff0c;则求M%N。如果余数为0&#xff0c;则N即为所求&#xff1b;如果…

csp真题字符串匹配c语言,CCF CSP认证考试历年真题 模板生成系统 C语言实现

试题编号&#xff1a;201509-3试题名称&#xff1a;日期计算 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述&#xff1a;成成最近在搭建一个网站&#xff0c;其中一些页面的部分内容来自数据库中不同的数据记录&#xff0c;但是页面的基本结构是相同的。例如&…

osgi架构与linux_OSGi:进入微服务架构的门户

osgi架构与linux在构建可扩展&#xff0c;可靠的分布式系统的背景下&#xff0c;“模块化”和“微服务体系结构”这两个术语如今经常出现。 众所周知&#xff0c;Java平台本身在模块化方面很弱&#xff08; Java 9将通过交付Jigsaw项目来解决此问题&#xff09;&#xff0c;这为…

引入我们全新的YouTube频道进行视频课程编程

嘿&#xff0c;极客们&#xff0c; 收到社区的反馈并紧贴行业发展趋势&#xff0c;我们非常高兴宣布推出全新的Youtube频道 &#xff01; 在我们的频道上&#xff0c;我们将主持与Java编程有关的视频课程&#xff0c;但通常也会进行软件开发。 我们将介绍代码演练以及完整的…