后台审核管理 ergo_Kogito,ergo规则:从知识到服务,轻松自如

后台审核管理 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

后台审核管理 ergo

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

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

相关文章

java转换文本文件到xlsx(自制缓冲区,无需先验文件行数)

【0】README0.1&#xff09;本文代码利用了 Apache POI 框架 建立 java 到 xlsx 代码的联系&#xff1b;0.2&#xff09;本文自制缓冲区从文本文件中读取数据读取&#xff0c;无需先验文件行数&#xff1b;0.3&#xff09;本文通过缓冲区大小创建数组&#xff0c;数组容量自动增…

spring react_使用Spring WebFlux构建React性REST API –第3部分

spring react在上一篇文章的续篇中&#xff0c;我们将看到一个应用程序以公开React性REST API。 在此应用程序中&#xff0c;我们使用了 带有WebFlux的Spring Boot 具有响应式支持的Cassandra的Spring数据 卡桑德拉数据库 下面是应用程序的高级体系结构。 让我们看一下bui…

tomcat(12)org.apache.catalina.core.StandardContext源码剖析

【0】README0&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(12)StandardContext源码剖析” 的基础知识&#xff1b;1&#xff09;Context实例表示一个具体的web 应用程序&#xff0c;其中包含一个或多个Wrapper实例&#xff0c;每个Wra…

jms面试题_最新的20多个JMS面试问答(2020)

jms面试题快速浏览JMS&#xff08;Java消息服务&#xff09;常见问题面试问题和答案。 2020年以来的最新问题已添加到列表中。 1.简介 在本教程中&#xff0c;我们将了解2020年经常问到的JMS面试问题。作为面试的一部分&#xff0c;如果您有6年以上的经验&#xff0c;就有机会…

tomcat(13)Host和Engine容器

【0】README0.1&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(13)Host和Engine容器” 的基础知识&#xff1b;0.2&#xff09;Host容器&#xff1a;若你想在同一个tomcat部署 上运行多个Context 容器的话&#xff0c;就需要使用 Host 容…

spring react_使用Spring WebFlux构建React性REST API –第2部分

spring react在上一篇文章的续篇中&#xff0c;我们将看到React式流规范及其实现之一&#xff0c;称为Project Reactor 。 React流规范定义了以下接口。 让我们看看这些接口的细节。 发布者→发布者是潜在数量不受限制的序列元素的提供者&#xff0c;可按其订阅者的要求发布它…

tomcat(14)服务器组件和服务组件

【0】README0.1&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(14)服务器组件和服务组件” 的基础知识&#xff1b;0.2&#xff09;for complete source code ,please visit https://github.com/pacosonTang/HowTomcatWorks/tree/maste…

组合模式的安全模式与透明模式

转载自 树形结构的处理——组合模式&#xff08;四&#xff09; 1 透明组合模式与安全组合模式 通过引入组合模式&#xff0c;Sunny公司设计的杀毒软件具有良好的可扩展性&#xff0c;在增加新的文件类型时&#xff0c;无须修改现有类库代码&#xff0c;只需增加一个新的文件类…

spring react_使用Spring WebFlux构建React性REST API –第1部分

spring react在本文中&#xff0c;我们将看到如何使用Spring WebFlux构建响应式REST API。 在进入React式API之前&#xff0c;让我们看看系统是如何发展的&#xff0c;传统REST实现遇到的问题以及现代API的需求。 如果您查看从旧版系统到下文所述的现代系统的期望&#xff0c;…

tomcat(15)Digester库

【0】README0.1&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(15)Digester库” 的基础知识&#xff1b;2&#xff09;problemsolution&#xff1a;2.1&#xff09;problem&#xff1a;如下面的代码&#xff0c;Bootstrap类实例化连接器…

api restful_HATEOAS的RESTful服务。 记录超媒体API

api restful1.简介 希望本教程的前一部分不仅揭示了超媒体和HATEOAS的深远意义&#xff0c;而且使我们确信这些都是RESTful Web服务和API的基本构建模块。 在这一部分中&#xff0c;我们将继续侧重于文档方面&#xff0c;以解决如何预先传递Web服务或API功能的问题。 目录 1.…

模版方法模式

转载自 23种设计模式&#xff08;6&#xff09;&#xff1a;模版方法模式定义&#xff1a;定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 类型&#xff1a;行为类模式 类图&#…

java并发编程实践(1)intro

【0】README0.1&#xff09;本文部分文字描述转自“java并发编程实践”&#xff0c;旨在学习“java并发编程实践(1)intro”的相关知识&#xff1b;【3】线程带来的风险【3.1】安全性问题1&#xff09;intro&#xff1a;在没有充足同步的case下&#xff0c;多个线程的操作执行顺…

读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例

读入的字节都写入字节数组中嗨&#xff0c;大家好&#xff0c;Java程序员经常在现实世界中遇到编程问题&#xff0c;他们需要将文件中的数据加载到字节数组中&#xff0c;该文件可以是文本文件或二进制文件。 一个示例是将文件的内容转换为String以显示。 不幸的是&#xff0c;…

迭代子模式

转载自 《JAVA与模式》之迭代子模式 在阎宏博士的《JAVA与模式》一书中开头是这样描述迭代子&#xff08;Iterator&#xff09;模式的&#xff1a; 迭代子模式又叫游标(Cursor)模式&#xff0c;是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部…

java并发编程实践(2)线程安全性

【0】README 0.0&#xff09;本文部分文字描述转自&#xff1a;“java并发编程实战”&#xff0c; 旨在学习“java并发编程实践(2)线程安全性” 的相关知识&#xff1b;0.1&#xff09;几个术语&#xff08;terms&#xff09;t1&#xff09;对象的状态&#xff1a;是指存储在状…

自动配置jdk_JDK 15中自动自动发送更好的NullPointerException消息

自动配置jdk我讨论了期待已久的和高度赞赏改进的NullPointerException &#xff08; NPE在帖&#xff09;消息“ 更好的默认NullPointerException异常消息即将到Java&#xff1f; ”和“ JDK 14中更好的NPE消息 ”。 当此JEP 358驱动的功能添加到JDK 14中时 &#xff0c;想要从…

tomat(16)关闭钩子

【0】REAMDE0&#xff09;本文部分文字描述转自&#xff1a;“how tomcat works”&#xff0c;旨在学习“tomat(16)关闭钩子”的相关知识&#xff1b;1&#xff09;problemsolution&#xff1a;1.1&#xff09;problem&#xff1a;在很多实际环境中&#xff0c;当用户关闭应用程…

apache.camel_Apache Camel 3.1 – XML路由的快速加载

apache.camelCamel 3.1中添加的一项功能是能够更快地加载XML路由。 这是我们为使Camel变得更小&#xff0c;更快而进行的总体工作的一部分。 您可能会说ewww XML。 但坦率地说&#xff0c;有很多Camel用户使用XML定义路由来构建应用程序。 在Camel 2.x中&#xff0c;您将不得不…

程序中 设置jvm 参数_高效应用程序的7个JVM参数

程序中 设置jvm 参数在撰写本文时&#xff08;2020年3月&#xff09;&#xff0c;围绕垃圾收集和内存&#xff0c;您可以将600多个参数传递给JVM。 如果您包括其他方面&#xff0c;则JVM参数总数将很容易超过1000个。 &#x1f60a;。 任何人都无法消化和理解太多的论据。 在本…