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

mx ergo

mx 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您仍将能够发布到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

mx ergo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值