开始在红帽决策管理器中构建 Kogito


Red Hat Decision Manager 7.12

摘要

本文档论述了如何在 Red Hat Decision Manager 中使用决策服务和规划解决方案。

前言

作为业务决策的开发人员,您可以使用红帽构建的 Kogito 构建来构建可适应业务域和工具的云原生应用程序。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 信息

部分 I. Red Hat build of Kogito 微服务入门

作为业务决策的开发人员,您可以使用红帽构建 Kogito 商业自动化来开发决策服务,使用决策模型和表示法(DMN)模型、Drools 规则语言(DRL)规则、预测模型标记语言(PMML)或所有三种方法的组合。

先决条件

  • 已安装了 JDK 11 或更高版本。
  • 已安装 Apache Maven 3.6.2 或更高版本。

Red Hat build of Kogito 是一个云原生业务自动化技术,用于构建云就绪型业务应用程序。名称 Kogito 从拉丁"Cogito"派生,如 "Cogito, ergo sum" 中所示,"I think I am",并且是 pronounced [","koPodsViolating.d的](KO-jee-to](KO-jee-to] (KO-jee-to])。字母 K 代表 Kubernetes,Red Hat OpenShift Container Platform 的基础作为 Red Hat Decision Manager 的目标云平台,以及有关红帽构建 Kogito 的开源业务自动化项目知识。

红帽在 Red Hat Decision Manager 中构建了 Kogito,针对混合云环境进行了优化,并满足您的域和工具需求。红帽构建的 Kogito 微服务的核心目标是帮助您将一组决策放入您自己的域特定云原生服务集合中。

重要

在 Red Hat Decision Manager 7.12 版本中,红帽构建的 Kogito 支持仅限于决策服务,包括决策模型和表示法(DMN)、Droal 规则语言(DRL)和预测模型标记语言(PMML)。以后的发行版本中,此支持将改进并扩展到业务流程建模标注(BPMN)。

当您使用红帽构建 Kogito 时,您将构建云原生应用程序作为一组独立的域特定微服务,以实现一些业务价值。您用于描述目标行为的决策是作为您创建的微服务的一部分执行的。生成的微服务高度分布式且可扩展,没有集中式编配服务,微服务使用的运行时针对所需的内容进行了优化。

作为业务规则开发人员,您可以使用红帽决策管理器中的 Kogito 微服务构建云原生应用程序,以满足您的业务域和工具。

1.1. 云优先优先级

红帽构建 Kogito 微服务,旨在在云基础架构上运行和扩展。您可以通过最新的基于云的技术(如红帽构建的 Quarkus)在 Red Hat Decision Manager 中使用红帽构建 Kogito 微服务,以提高容器应用平台(如 Red Hat OpenShift Container Platform)的开始时间和即时扩展。

例如,红帽构建的 Kogito 微服务与以下技术兼容:

  • Red Hat OpenShift Container Platform 基于 Kubernetes,是构建和管理容器化应用程序的目标平台。
  • 红帽构建的 Quarkus 是 Kubernetes 的原生 Java 堆栈,可用于使用红帽构建 Kogito 微服务来构建应用程序。
  • Spring Boot 是一个应用程序框架,可用于使用红帽决策管理器配置 Spring Framework。

红帽构建的 Kogito 微服务支持的主要 Java 框架是红帽构建的 Quarkus 和 Spring Boot。

Red Hat build of Quarkus 是一个 Kubernetes 原生 Java 框架,它提供了一个构建 Java 应用程序的容器第一方法,特别是 Java 虚拟机(JVM),如 OpenJDK HotSpot。Red Hat build of Quarkus 通过减少 Java 应用程序和容器镜像占用空间的大小,消除之前生成的一些 Java 编程工作负载,并减少运行这些镜像所需的内存量来专门优化 Java。

对于红帽构建 Kogito 微服务,红帽构建的 Quarkus 是最佳 Kubernetes 兼容性和增强开发人员功能的首选框架,如实时重新加载开发模式,用于高级调试。

Spring Boot 是基于 Java 的框架,用于构建独立生产就绪的 Spring 应用程序。Spring Boot 可让您使用最小配置和不需要整个 Spring 配置设置来开发 Spring 应用程序。

对于 Red Hat build of Kogito 微服务,支持 Spring Boot,在现有 Spring Framework 环境中需要使用 Red Hat Decision Manager 的开发人员。

Red Hat Decision Manager 提供扩展或应用程序,您可以使用它们为使用图形模型器的红帽构建 Kogito 微服务设计决策模型设计决策模型。

支持以下 DMN 型号器:

  • VS Code 扩展 :允许您在 Visual Studio Code (VS Code)中查看和设计 DMN 模型。VS Code 扩展需要 VS Code 1.46.0 或更高版本。

    要直接在 VS Code 中安装 VSCode 扩展,请在 VS Code 中选择 Extensions 菜单选项,再搜索并安装 Red Hat Business Automation Bundle 扩展。

  • 业务模型 器单机编辑器 :使您能够查看并设计嵌入在 web 应用程序中的 DMN 模型。要下载所需的文件,您可以使用 Kogito 工具存储库中的 NPM 工件,或为 DMN 独立编辑器库直接下载 JavaScript 文件,网址为 https://kiegroup.github.io/kogito-online/standalone/dmn/index.js

Red Hat Decision Manager 提供了一个 Red Hat Business Automation Bundle VS Code 扩展,它可让您在 VS Code 中设计决策模型和符号(DMN)决策模型、业务流程模型和注释(BPMN) 2.0 业务流程,并直接在 VS Code 中直接测试场景。VS Code 是开发新业务应用程序的首选集成开发环境(IDE)。Red Hat Decision Manager 还会根据需要为 DMN 或 BPMN Editor VS Code 扩展提供单独的 DMN Editor 和 ClusterClaim Editor VS Code 扩展。

重要

VS Code 中的编辑器部分与 Business Central 中的编辑器兼容,而 VS Code 不支持几个 Business Central 功能。

先决条件

  • 已安装 VS Code 的最新稳定版本。

流程

  1. 在 VS Code IDE 中,选择 Extensions 菜单选项,再搜索 Red Hat Business Automation Bundle for DMN、Janllanand 和 test scenario 文件支持。

    对于 DMN 或 BPMN 文件支持,您还可以搜索单独的 DMN Editor 或soa Editor 扩展。

  2. Red Hat Business Automation Bundle 扩展出现在 VS Code 中时,选择它并单击 Install
  3. 为获得最佳 VS Code 编辑器行为,请在扩展安装完成后,重新加载或关闭并重新启动 VS Code 的实例。

安装 VS Code 扩展捆绑包后,在 VS Code 中打开或创建的任何 .dmn.bpmn.bpmn2 文件将自动显示为图形模型。此外,您打开或创建的任何 .scesim 文件都自动显示为测试您的业务决策功能的表格测试方案模型。

如果 DMN、GINX 或测试方案模型器只打开 DMN、Payango 或测试场景文件的 XML 源,并显示错误消息,请查看报告的错误和型号文件,以确保正确定义了所有元素。

注意

对于新的 DMN 或 HPP 模型,您还可以在 Web 浏览器中输入 dmn.newbpmn.new,以在在线模型程序中设计您的 DMN 或 FDO 模型。完成模型创建后,您可以点击在线模型页面中的 Download,将 DMN 或 mail 文件导入到 VS Code 中的 Red Hat Decision Manager 项目中。

2.2. 配置 Red Hat Decision Manager 独立编辑器

Red Hat Decision Manager 提供独立编辑器,可在自包含的库中分发,为每个编辑器提供一体 JavaScript 文件。JavaScript 文件使用全面的 API 来设置和控制编辑器。

您可以使用以下方法安装独立编辑器:

  • 手动下载每个 JavaScript 文件
  • 使用 NPM 软件包

流程

  1. 使用以下方法之一安装独立编辑器:

    手动下载每个 JavaScript 文件 :对于此方法,请按照以下步骤操作:

    1. 下载 JavaScript 文件。
    2. 将下载的 Javascript 文件添加到您托管的应用程序中。
    3. 将以下 &lt ;script& gt; 标签添加到 HTML 页面中:

      DMN 编辑器的 HTML 页面的脚本标签

      <script src="https://<YOUR_PAGE>/dmn/index.js"></script>

      FDO 编辑器的 HTML 页面的脚本标签

      <script src="https://<YOUR_PAGE>/bpmn/index.js"></script>

    使用 NPM 软件包 :对于此方法,请按照以下步骤操作:

    1. 将 NPM 软件包添加到您的 package.json 文件中:

      添加 NPM 软件包

      npm install @kogito-tooling/kie-editors-standalone

    2. 将每个编辑器库导入到您的 TypeScript 文件中:

      导入每个编辑器

      import * as DmnEditor from "@kogito-tooling/kie-editors-standalone/dist/dmn"
      import * as BpmnEditor from "@kogito-tooling/kie-editors-standalone/dist/bpmn"

  2. 安装独立编辑器后,使用提供的编辑器 API 打开所需的编辑器,如下例所示以打开 DMN 编辑器。每个编辑器的 API 相同。

    打开 DMN 独立编辑器

    const editor = DmnEditor.open({
      container: document.getElementById("dmn-editor-container"),
      initialContent: Promise.resolve(""),
      readOnly: false,
      origin: "",
      resources: new Map([
        [
          "MyIncludedModel.dmn",
          {
            contentType: "text",
            content: Promise.resolve("")
          }
        ]
      ])
    });

    在编辑器 API 中使用以下参数:

    Expand
    表 2.1. 参数示例
    参数描述

    container

    附加编辑器的 HTML 元素。

    initialContent

    对 DMN 模型内容的承诺.这个参数可以为空,如下例所示:

    • Promise.resolve("")
    • Promise.resolve("<DIAGRAM_CONTENT_DIRECTLY_HERE>")
    • fetch("MyDmnModel.dmn").then(content ⇒ content.text())

    ReadOnly (可选)

    允许您允许编辑器中的更改。设置为 false (默认)以允许在编辑器中为只读模式进行内容编辑和 true

    origin (可选)

    存储库的来源。默认值为 window.location.origin

    资源 (可选)

    编辑器的资源映射。例如,此参数用于为 DMN 编辑器提供包括的模型,或为 FDO 编辑器的工作项目定义。映射中的每个条目都包含一个资源名称,以及一个由 content -type (文本 或二进制)和内容(与 initialContent 参数类似)组成的对象。

    返回的对象包含操作编辑器所需的方法。

    Expand
    表 2.2. 返回的对象方法
    方法描述

    getContent(): Promise<string>

    返回包含编辑器内容的承诺。

    setContent(path: string, content: string): void

    设置编辑器的内容。

    getPreview(): Promise<string>

    返回包含当前图表 SVG 字符串的承诺。

    subscribeToContentChanges(callback: (isDirty: boolean) ⇒ void): (isDirty: boolean) ⇒ void

    将回调设置为在编辑器中的内容更改时,并返回相同的回调以用于取消订阅。

    unsubscribeToContentChanges(callback: (isDirty: boolean) ⇒ void): void

    在编辑器中的内容更改时取消订阅传递的回调。

    markAsSaved(): void

    重置编辑器状态,指示编辑器中的内容已保存。另外,它还激活与内容更改相关的订阅回调。

    undo(): void

    撤销编辑器中的最后更改。另外,它还激活与内容更改相关的订阅回调。

    redo(): void

    在编辑器中执行最近一次撤消的更改。另外,它还激活与内容更改相关的订阅回调。

    close(): void

    关闭编辑器。

    getElementPosition (selector: string): Promise<Rect>

    提供了在可组合或视频组件内存在元素时扩展标准查询选择器的替代选择。selector 参数必须遵循 < PROVIDER>:::<SELECT& gt; 格式,如 Canvas:::MySquarevideo:::PresenterHand。此方法返回一个代表元素位置的 Rect

    envelopeApi: MessageBusClientApi<KogitoEditorEnvelopeApi>

    这是高级编辑器 API。有关高级编辑器 API 的更多信息,请参阅 MessageBusClientApiKogitoEditorEnvelopeApi

在开始开发 Kogito 微服务的红帽构建前,您需要创建一个 Maven 项目,您可以在其中构建资产以及应用程序的任何其他相关资源。

流程

  1. 在命令终端中,导航到要存储新项目的本地文件夹。
  2. 输入以下命令在定义的文件夹中生成项目:

    在 Red Hat build of Quarkus 上

    $ mvn io.quarkus:quarkus-maven-plugin:create \
        -DprojectGroupId=org.acme -DprojectArtifactId=sample-kogito \
        -DprojectVersion=1.0.0-SNAPSHOT -Dextensions=kogito-quarkus

    在 Spring Boot 上

    $ mvn archetype:generate \
        -DarchetypeGroupId=org.kie.kogito \
        -DarchetypeArtifactId=kogito-spring-boot-archetype \
        -DgroupId=org.acme -DartifactId=sample-kogito \
        -DarchetypeVersion=1.11.0.Final \
        -Dversion=1.0-SNAPSHOT

    此命令生成 sample-kogito Maven 项目,并导入扩展以准备应用程序以进行业务自动化。

    如果要为项目启用 PMML 执行,请将以下依赖项添加到 Maven 项目中的 pom.xml 文件中,该文件包含您的红帽构建 Kogito 微服务:

    启用 PMML 执行的依赖项

    <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-pmml</artifactId>
    </dependency>
    <dependency>
      <groupId>org.jpmml</groupId>
      <artifactId>pmml-model</artifactId>
    </dependency>

    在 Red Hat build of Quarkus 上,如果您计划在 OpenShift 上运行应用程序,还必须为 存活度和就绪度探测 导入 smallrye-health 扩展,如下例所示:

    Red Hat build of Quarkus 应用程序在 OpenShift 中小型健康扩展

    $ mvn quarkus:add-extension -Dextensions="smallrye-health"

    此命令在红帽构建的 Quarkus 上的 Red Hat Decision Manager 项目的 pom.xml 文件中生成以下依赖项:

    Red Hat build of Quarkus applications on OpenShift

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-smallrye-health</artifactId>
    </dependency>

  3. 在 VS Code IDE 中打开或导入项目,以查看其内容。

您可以使用 Spring Boot archetype 为 Kogito 微服务的红帽构建创建自定义 Maven 项目。Spring Boot archetype 可让您在项目中添加 Spring Boot 启动器或附加组件。

Spring Boot Starter 是项目的一站式描述符,需要红帽构建的 Kogito 提供的业务自动化引擎。Spring Boot Starters 包括决策、规则和预测。

如果您的项目包含所有资产,并且希望快速开始使用 Kogito 的红帽构建,您可以使用 kogito-spring-boot-starter 启动程序。对于更精细的方法,您可以使用特定的初学者,如 kogito-decisions-spring-boot-starter 做出决策,或是初学者的组合。

红帽构建的 Kogito 支持以下 Spring Boot 启动器:

决策 Spring Boot Starter

为 Spring Boot 项目提供 DMN 支持的入门程序。以下是在项目中添加 Spring 引导启动程序的示例:

<dependencies>
  <dependency>
    <groupId>org.kie.kogito</groupId>
    <artifactId>kogito-decisions-spring-boot-starter</artifactId>
  </dependency>
</dependencies>
预测 Spring Boot 启动程序

为 Spring Boot 项目提供 PMML 支持的入门程序。以下是在项目中添加预测 Spring 引导启动程序的示例:

<dependencies>
  <dependency>
    <groupId>org.kie.kogito</groupId>
    <artifactId>kogito-predictions-spring-boot-starter</artifactId>
  </dependency>
</dependencies>
规则 Spring Boot 启动程序

为 Spring Boot 项目提供 DRL 支持的入门程序。以下是在项目中添加规则 Spring 引导启动程序的示例:

<dependencies>
  <dependency>
    <groupId>org.kie.kogito</groupId>
    <artifactId>kogito-rules-spring-boot-starter</artifactId>
  </dependency>
</dependencies>

流程

  1. 在命令终端中,导航到要存储新项目的本地文件夹。
  2. 输入以下命令使用 startersaddons 属性生成项目之一:

    • 要使用 starters 属性生成项目,请输入以下命令:

      $ mvn archetype:generate \
          -DarchetypeGroupId=org.kie.kogito \
          -DarchetypeArtifactId=kogito-springboot-archetype \
          -DgroupId=org.acme -DartifactId=sample-kogito \
          -DarchetypeVersion=1.11.0.Final \
          -Dversion=1.0-SNAPSHOT
          -Dstarters=decisions

      新项目包含运行决策微服务所需的依赖项。您可以使用以逗号分隔的列表组合多个 Spring Boot 启动器,如 starters=decisions,rules

    • 要使用 addons 属性生成包含 Prometheus 监控的项目,请输入以下命令:

      $ mvn archetype:generate \
          -DarchetypeGroupId=org.kie.kogito \
          -DarchetypeArtifactId=kogito-springboot-archetype \
          -DgroupId=org.acme -DartifactId=sample-kogito \
          -DarchetypeVersion=1.11.0.Final \
          -Dversion=1.0-SNAPSHOT
          -Dstarters=descisions
          -Daddons=monitoring-prometheus,persistence-infinispan
      注意

      当您将附加组件传递给属性时,附加组件名称不需要 kogito-addons-springboot 前缀。另外,您可以组合 附加组件和 初学者 属性来自定义项目。

  3. 在 IDE 中打开或导入项目,以查看其内容。

红帽构建的 Kogito 微服务包括 rhdm-7.12.0-kogito-and-optaplanner-quickstarts.zip 文件中的示例应用程序。这些示例应用程序包含红帽构建的 Quarkus 或 Spring Boot 的各种服务,以帮助您开发自己的应用程序。该服务使用一个或多个 Decision Model 和 Notation (DMN)决策模型、Drools 规则语言(DRL)规则单元、预测模型(PMML)模型或 Java 类来定义服务逻辑。

有关每个示例应用程序和使用说明的详情,请查看相关应用程序文件夹中的 README 文件。

注意

在本地环境中运行示例时,请确保环境与相关应用文件夹的 README 文件中所列的要求匹配。另外,这可能要求提供必要的网络端口,如 Red Hat build of Quarkus, Spring Boot, 和 docker-compose (如果适用)。

以下列表描述了红帽构建 Kogito 微服务的一些示例:

决策服务
  • DMN -quarkus-exampledmn-springboot-example: 决策服务(在 Red Hat build of Quarkus 或 Spring Boot 上),使用 DMN 来确定驱动程序损失,并根据流量违反情况。
  • rules-quarkus-helloworld :红帽构建带有单个 DRL 规则单元的 Quarkus 的 Hello World 决策服务。
  • ruleunit-quarkus-exampleruleunit-springboot-example: 决策服务(红帽构建的 Quarkus 或 Spring Boot),它使用 DRL 验证 loan 应用程序,并公开 REST 操作来查看应用程序状态。
  • DMN -pmml-quarkus-exampledmn-pmml-springboot-example: 一个决策服务(在 Red Hat build of Quarkus 或 Spring Boot 上),它使用 DMN 和 PMML 来确定基于流量违反情况的驱动程序损失和挂起。
  • DMN-drools-quarkus-metricsdmn-drools-springboot-metrics: 决策服务(在 Red Hat build of Quarkus 或 Spring Boot)中,启用并消耗红帽构建中的运行时指标监控功能。
  • pmml-quarkus-examplepmml-springboot-example :使用 PMML 的决策服务(在红帽构建的 Quarkus 或 Spring Boot)上。

如需更多信息,请参阅使用 DMN 模型设计决策服务,使用 DRL 规则设计决策服务以及使用 PMML 模型设计决策服务

创建项目后,您可以在项目的 src/main/resources 文件夹中创建或导入 Decision Model 和 Notation (DMN)决策模型和 Drools 规则语言(DRL)业务规则。您还可以在项目的 src/main/java 文件夹中包括作为 Java 服务或提供您从决策调用的实施的 Java 类。

此流程的示例是 Kogito 微服务的基本红帽构建,可提供 REST 端点 /persons。此端点根据示例 PersonDecisions.dmn DMN 模型自动生成,以根据正在处理的数据做出决策。

业务决策包含红帽决策管理器服务的决策逻辑。您可以通过不同的方式定义业务规则和决策,如使用 DMN 模型或 DRL 规则。此流程的示例使用 DMN 模型。

先决条件

流程

  1. 在您为红帽决策管理器服务生成的 Maven 项目中,导航到 src/main/java/org/acme 文件夹,再添加以下 Person.java 文件:

    person Java 对象示例

    package org.acme;
    
    import java.io.Serializable;
    
    public class Person {
    
    	private String name;
    	private int age;
    	private boolean adult;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public boolean isAdult() {
    		return adult;
    	}
    
    	public void setAdult(boolean adult) {
    		this.adult = adult;
    	}
    
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + ", adult=" + adult + "]";
    	}
    
    }

    这个示例 Java 对象集并检索人的名称、年龄和行业状态。

  2. 导航到 src/main/resources 文件夹并添加以下 PersonDecisions.dmn DMN 决策模型:

    图 5.1. PersonDecisions DMN 决策要求图(DRD)示例

    PersonDecisions 决策图的镜像

    图 5.2. 用于 isAdult 决策的 DMN 框表达式示例

    PersonDecisions 决策表的镜像

    图 5.3. DMN 数据类型示例

    PersonDecisions 数据类型的镜像

    这个示例 DMN 模型包含一个基本的 DMN 输入节点,以及由带有自定义结构化数据类型的 DMN 决策表定义的决策节点。

    在 VSCode 中,您可以添加 Red Hat Business Automation Bundle VSCode 扩展,以使用 DMN 模型器设计决策要求图(DRD)、框表达式和数据类型。

    要快速创建这个示例 DMN 模型,您可以复制以下 PersonDecisions.dmn 文件内容:

    DMN 文件示例

    <dmn:definitions xmlns:dmn="http://www.omg.org/spec/DMN/20180521/MODEL/" xmlns="https://kiegroup.org/dmn/_52CEF9FD-9943-4A89-96D5-6F66810CA4C1" xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/" xmlns:kie="http://www.drools.org/kie/dmn/1.2" xmlns:dmndi="http://www.omg.org/spec/DMN/20180521/DMNDI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" xmlns:feel="http://www.omg.org/spec/DMN/20180521/FEEL/" id="_84B432F5-87E7-43B1-9101-1BAFE3D18FC5" name="PersonDecisions" typeLanguage="http://www.omg.org/spec/DMN/20180521/FEEL/" namespace="https://kiegroup.org/dmn/_52CEF9FD-9943-4A89-96D5-6F66810CA4C1">
      <dmn:extensionElements/>
      <dmn:itemDefinition id="_DEF2C3A7-F3A9-4ABA-8D0A-C823E4EB43AB" name="tPerson" isCollection="false">
        <dmn:itemComponent id="_DB46DB27-0752-433F-ABE3-FC9E3BDECC97" name="Age" isCollection="false">
          <dmn:typeRef>number</dmn:typeRef>
        </dmn:itemComponent>
        <dmn:itemComponent id="_8C6D865F-E9C8-43B0-AB4D-3F2075A4ECA6" name="Name" isCollection="false">
          <dmn:typeRef>string</dmn:typeRef>
        </dmn:itemComponent>
        <dmn:itemComponent id="_9033704B-4E1C-42D3-AC5E-0D94107303A1" name="Adult" isCollection="false">
          <dmn:typeRef>boolean</dmn:typeRef>
        </dmn:itemComponent>
      </dmn:itemDefinition>
      <dmn:inputData id="_F9685B74-0C69-4982-B3B6-B04A14D79EDB" name="Person">
        <dmn:extensionElements/>
        <dmn:variable id="_0E345A3C-BB1F-4FB2-B00F-C5691FD1D36C" name="Person" typeRef="tPerson"/>
      </dmn:inputData>
      <dmn:decision id="_0D2BD7A9-ACA1-49BE-97AD-19699E0C9852" name="isAdult">
        <dmn:extensionElements/>
        <dmn:variable id="_54CD509F-452F-40E5-941C-AFB2667D4D45" name="isAdult" typeRef="boolean"/>
        <dmn:informationRequirement id="_2F819B03-36B7-4DEB-AED6-2B46AE3ADB75">
          <dmn:requiredInput href="#_F9685B74-0C69-4982-B3B6-B04A14D79EDB"/>
        </dmn:informationRequirement>
        <dmn:decisionTable id="_58370567-05DE-4EC0-AC2D-A23803C1EAAE" hitPolicy="UNIQUE" preferredOrientation="Rule-as-Row">
          <dmn:input id="_ADEF36CD-286A-454A-ABD8-9CF96014021B">
            <dmn:inputExpression id="_4930C2E5-7401-46DD-8329-EAC523BFA492" typeRef="number">
              <dmn:text>Person.Age</dmn:text>
            </dmn:inputExpression>
          </dmn:input>
          <dmn:output id="_9867E9A3-CBF6-4D66-9804-D2206F6B4F86" typeRef="boolean"/>
          <dmn:rule id="_59D6BFF0-35B4-4B7E-8D7B-E31CB0DB8242">
            <dmn:inputEntry id="_7DC55D63-234F-497B-A12A-93DA358C0136">
              <dmn:text>&gt; 18</dmn:text>
            </dmn:inputEntry>
            <dmn:outputEntry id="_B3BB5B97-05B9-464A-AB39-58A33A9C7C00">
              <dmn:text>true</dmn:text>
            </dmn:outputEntry>
          </dmn:rule>
          <dmn:rule id="_8FCD63FE-8AD8-4F56-AD12-923E87AFD1B1">
            <dmn:inputEntry id="_B4EF7F13-E486-46CB-B14E-1D21647258D9">
              <dmn:text>&lt;= 18</dmn:text>
            </dmn:inputEntry>
            <dmn:outputEntry id="_F3A9EC8E-A96B-42A0-BF87-9FB1F2FDB15A">
              <dmn:text>false</dmn:text>
            </dmn:outputEntry>
          </dmn:rule>
        </dmn:decisionTable>
      </dmn:decision>
      <dmndi:DMNDI>
        <dmndi:DMNDiagram>
          <di:extension>
            <kie:ComponentsWidthsExtension>
              <kie:ComponentWidths dmnElementRef="_58370567-05DE-4EC0-AC2D-A23803C1EAAE">
                <kie:width>50</kie:width>
                <kie:width>100</kie:width>
                <kie:width>100</kie:width>
                <kie:width>100</kie:width>
              </kie:ComponentWidths>
            </kie:ComponentsWidthsExtension>
          </di:extension>
          <dmndi:DMNShape id="dmnshape-_F9685B74-0C69-4982-B3B6-B04A14D79EDB" dmnElementRef="_F9685B74-0C69-4982-B3B6-B04A14D79EDB" isCollapsed="false">
            <dmndi:DMNStyle>
              <dmndi:FillColor red="255" green="255" blue="255"/>
              <dmndi:StrokeColor red="0" green="0" blue="0"/>
              <dmndi:FontColor red="0" green="0" blue="0"/>
            </dmndi:DMNStyle>
            <dc:Bounds x="404" y="464" width="100" height="50"/>
            <dmndi:DMNLabel/>
          </dmndi:DMNShape>
          <dmndi:DMNShape id="dmnshape-_0D2BD7A9-ACA1-49BE-97AD-19699E0C9852" dmnElementRef="_0D2BD7A9-ACA1-49BE-97AD-19699E0C9852" isCollapsed="false">
            <dmndi:DMNStyle>
              <dmndi:FillColor red="255" green="255" blue="255"/>
              <dmndi:StrokeColor red="0" green="0" blue="0"/>
              <dmndi:FontColor red="0" green="0" blue="0"/>
            </dmndi:DMNStyle>
            <dc:Bounds x="404" y="311" width="100" height="50"/>
            <dmndi:DMNLabel/>
          </dmndi:DMNShape>
          <dmndi:DMNEdge id="dmnedge-_2F819B03-36B7-4DEB-AED6-2B46AE3ADB75" dmnElementRef="_2F819B03-36B7-4DEB-AED6-2B46AE3ADB75">
            <di:waypoint x="504" y="489"/>
            <di:waypoint x="404" y="336"/>
          </dmndi:DMNEdge>
        </dmndi:DMNDiagram>
      </dmndi:DMNDI>
    </dmn:definitions>

    要使用 DMN 模型器在 VSCode 中创建这个示例 DMN 模型,请按照以下步骤执行:

    1. 打开空 PersonDecisions.dmn 文件,点 DMN 模型程序右上角的 Properties 图标,并确认 DMN 模型 名称 是否已设置为 PersonDecisions
    2. 在左侧面板中,选择 DMN Input Data,将节点拖到 canvas,然后双击该节点将其命名为 Person
    3. 在左侧面板中,将 DMN Decision 节点拖到 canvas,双击节点以将其命名为 isAdult,并将它从输入节点链接到它。
    4. 选择决策节点以显示节点选项,然后单击 Edit 图标以打开 DMN boxed 表达式编辑器,以定义节点的决策逻辑。
    5. 单击 未定义表达式 字段,再选择 Decision Table
    6. 单击路由表的左上角,将 hit 策略设置为 unique
    7. 设置输入和输出列,使输入源 Person.Age 带有类型 决定了年龄限制,输出目标为 Adult with type boolean determines adult status:

      图 5.4. 的 DMN 路由表示例

      PersonDecisions 决策表的镜像
    8. 在上面的标签页选项中,选择 Data Types 选项卡,并添加以下 tPerson 结构化数据类型和嵌套数据类型:

      图 5.5. DMN 数据类型示例

      PersonDecisions 数据类型的镜像
    9. 定义数据类型后,选择 Editor 选项卡以返回到 DMN 模型程序 canvas。
    10. 选择 Person 输入节点,单击 Properties 图标,然后在 Information 项 下,将 Data type 设置为 tPerson
    11. 选择 isAdult decision node,点 Properties 图标,然后在 Information 项 下,确认 Data type 仍然设置为 布尔值。您之前在创建路由表时设置此数据类型。
    12. 保存 DMN 决策文件。

5.1. 使用 DRL 规则单元作为替代决策服务

您还可以使用作为规则单元实施的 Drools 规则语言(DRL)文件来定义此示例决策服务,作为使用 Decision Model 和 Notation (DMN)的替代选择。

DRL 规则单元是规则和执行单元的模块。规则单元收集一组规则,并声明规则所执行的事实类型。规则单元也充当每个规则组的唯一命名空间。单个规则基础可以包含多个规则单元。您通常在与单元声明相同的文件中存储单元的所有规则,以便该单元是自包含的。有关规则单元的更多信息,请参阅使用 DRL 规则设计决策服务

先决条件

流程

  1. 在示例项目的 src/main/resources 文件夹中,而不是使用 DMN 文件,请添加以下 PersonRules.drl 文件:

    PersonRules DRL 文件示例

    package org.acme
    unit PersonRules;
    
    import org.acme.Person;
    
    rule isAdult
    	when
    		$person: /person[ age > 18 ]
    	then
        modify($person) {
        	setAdult(true)
        };
    	end
    
    	query persons
    		$p : /person[ adult ]
    		end

    这个示例规则决定了任何早于 18 的人被归类为 adult。规则文件还声明该规则属于规则 unit PersonRules。构建项目时,会生成规则单元并与 DRL 文件关联。

    规则还使用 OOPath 表示法定义条件。OOPath 是 XPath 的面向对象的语法扩展,用于在处理集合和过滤限制时通过相关元素导航。

    您还可以使用传统规则模式语法以更明确的形式重写相同的规则条件,如下例所示:

    使用传统表示法的 PersonRules DRL 文件示例

    package org.acme
    unit PersonRules;
    
    import org.acme.Person;
    
    rule isAdult
    	when
    		$person: Person(age > 18) from person
    	then
        modify($person) {
        	setAdult(true)
        };
    	end
    
    	query persons
    		$p : /person[ adult ]
    		end

第 6 章 Red Hat build of Kogito events add-on

事件附加组件为 EventEmitterEventReceiver 接口在支持的目标平台中提供默认实现。您可以使用 EventEmitterEventReceiver 接口,通过进程、无服务器工作流事件和事件决策处理来实现消息传递。

任何依赖附加组件都可以实施 MessagePayloadDecorator

先决条件

  • 您已在 Kogito 的红帽构建中安装了 Events 附加组件。

流程

  1. 在类路径中创建一个名为 META-INF/services/org.kie.kogito.add-on.cloudevents.message.MessagePayloadDecorator 的文件。
  2. 打开 文件。
  3. 在文件中输入您的实施类的完整名称。
  4. 保存该文件。

    MessagePayloadDecoratorProvider 在应用程序启动时加载该文件,并将文件添加到 decoration 链中。当红帽构建的 Kogito 调用 MessagePayloadDecoratorProvider#decorate 时,您的实施是去除算法的一部分。

  5. 要使用事件附加组件,请在项目的 pom.xml 文件中添加以下代码:

    用于 {QAURKUS} 的事件小附加组件.

    <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-addons-quarkus-events-smallrye</artifactId>
      <version>1.15</version>
    </dependency>

    适用于 {QAURKUS} 的事件决策附加组件

    <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-addons-events-decisions</artifactId>
      <version>1.15</version>
    </dependency>

    Events Kafka 附加组件用于 Spring Boot

    <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-addons-springboot-events-kafka</artifactId>
      <version>1.15</version>
    </dependency>

    事件决策附加组件用于 Spring Boot

    <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-addons-springboot-events-decisions</artifactId>
      <version>1.15</version>
    </dependency>

第 7 章 运行红帽构建的 Kogito 微服务

为红帽构建 Kogito 微服务设计商业决策后,您可以使用以下模式之一运行红帽构建的 Quarkus 或 Spring Boot 应用程序:

  • 开发模式 : 用于本地测试.在红帽构建的 Quarkus 上,开发模式还在您运行的应用程序中实时重新载入您的决策,以进行高级调试。
  • JVM 模式 :为了与 Java 虚拟机(JVM)兼容。

流程

在命令终端中,导航到包含红帽构建 Kogito 微服务的项目,并输入以下命令之一,具体取决于您首选的运行模式和应用程序环境:

  • 对于开发模式:

    在 Red Hat build of Quarkus 上

    $ mvn clean compile quarkus:dev

    在print Boot 上

    $ mvn clean compile spring-boot:run

  • 对于 JVM 模式:

    在 Red Hat build of Quarkus 和 Spring Boot 上

    $ mvn clean package
    $ java -jar target/sample-kogito-1.0-SNAPSHOT-runner.jar

在红帽构建的 Kogito 微服务运行后,您可以发送 REST API 请求以与您的应用程序交互,并根据您如何设置应用程序来执行微服务。

本例测试 /persons REST API 端点,该端点在 PersonDecisions.dmn 文件中自动生成决策(如果使用 DRL 规则单元,则为 PersonRules.drl 文件中的规则)。

在本例中,使用 REST 客户端、curl 工具或为应用程序配置的 Swagger UI (如 http://localhost:8080/q/swagger-uihttp://localhost:8080/swagger-ui.html)发送带有以下组件的 API 请求:

  • URL:http://localhost:8080/persons
  • HTTP 标头: 对于 POST 请求:

    • 接受:application/json
    • Content-type:application/json
  • HTTP 方法GETPOSTDELETE

添加dult (JSON)的 POST 请求正文示例

{
  "person": {
    "name": "John Quark",
    "age": 20
  }
}

添加dult 的 curl 命令示例

curl -X POST http://localhost:8080/persons -H 'content-type: application/json' -H 'accept: application/json' -d '{"person": {"name":"John Quark", "age": 20}}'

响应示例(JSON)

{
  "id": "3af806dd-8819-4734-a934-728f4c819682",
  "person": {
    "name": "John Quark",
    "age": 20,
    "adult": false
  },
  "isAdult": true
}

这个示例步骤使用 curl 命令方便。

流程

在独立于正在运行的应用程序的命令终端窗口中,导航到包含 Kogito 微服务红帽构建的项目,并使用以下任何 curl 命令与 JSON 请求交互:

注意

在 Spring Boot 中,您可能需要修改应用程序如何公开 API 端点,以便这些示例请求正常工作。如需更多信息,请参阅您为本教程创建的 Spring Boot 项目中包含的 README 文件。

  • 添加一个dult 个人:

    请求示例

    curl -X POST http://localhost:8080/persons -H 'content-type: application/json' -H 'accept: application/json' -d '{"person": {"name":"John Quark", "age": 20}}'

    响应示例

    {"id":"3af806dd-8819-4734-a934-728f4c819682","person":{"name":"John Quark","age":20,"adult":false},"isAdult":true}

  • 添加一个不足的个人:

    请求示例

    curl -X POST http://localhost:8080/persons -H 'content-type: application/json' -H 'accept: application/json' -d '{"person": {"name":"Jenny Quark", "age": 15}}'

    响应示例

    {"id":"8eef502b-012b-4628-acb7-73418a089c08","person":{"name":"Jenny Quark","age":15,"adult":false},"isAdult":false}

  • 使用返回的 UUID 完成评估:

    请求示例

    curl -X POST http://localhost:8080/persons/8eef502b-012b-4628-acb7-73418a089c08/ChildrenHandling/cdec4241-d676-47de-8c55-4ee4f9598bac -H 'content-type: application/json' -H 'accept: application/json' -d '{}'

作为业务决策和流程的开发人员,您可以在 Red Hat OpenShift Container Platform 上部署红帽构建 Kogito 微服务以进行云实施。RHPAM Kogito Operator 为您或指导您完成部署过程自动进行许多部署步骤。

先决条件

  • 安装了 Red Hat OpenShift Container Platform 4.6 或 4.7。
  • 创建了用于部署的 OpenShift 项目。

您可以在 Red Hat OpenShift Container Platform 上部署红帽构建 Kogito 微服务以进行云实施。在这种架构中,红帽构建 Kogito 微服务部署为 OpenShift pod,您可以单独扩展和缩减,以根据特定服务所需的数量或多个容器提供。

为了帮助您在 OpenShift 上部署红帽构建 Kogito 微服务,红帽决策管理器提供了 Red Hat Process Automation Manager Kogito Operator。此 Operator 指导您完成部署过程。Operator 基于 Operator SDK,并为您自动执行许多部署步骤。例如,当您为 Operator 提供包含应用程序的 Git 存储库的链接时,Operator 会自动配置从源构建项目所需的组件并部署生成的服务。

要在 OpenShift Web 控制台中安装 Red Hat Process Automation Manager Kogito Operator,请进入左侧菜单中的 OperatorsOperatorHub,搜索并选择 RHPAM Kogito Operator,并按照屏幕上的说明来安装最新的 Operator 版本。

在创建了红帽构建的 Kogito 微服务作为业务应用程序的一部分后,您可以使用 Red Hat OpenShift Container Platform Web 控制台来部署微服务。OpenShift Web 控制台中的 RHPAM Kogito Operator 页面指导您完成部署过程。

RHPAM Kogito Operator 支持以下选项在 Red Hat OpenShift Container Platform 上构建和部署 Kogito 微服务:

  • Git 源构建和部署
  • 二进制构建和部署
  • 自定义镜像构建和部署
  • 文件构建和部署

RHPAM Kogito Operator 使用以下自定义资源来部署域特定的微服务(您开发的微服务):

  • KogitoBuild 使用 Git URL 或其他源构建应用程序,并生成运行时镜像。
  • KogitoRuntime 启动运行时镜像,并根据您的要求进行配置。

在大多数情况下,您可以使用标准运行时构建和部署方法从 Git 存储库源在 OpenShift 上部署 Kogito 微服务的红帽构建,如以下步骤所示。

注意

如果您要在本地开发或测试 Kogito 微服务的红帽构建,您可以使用二进制构建、自定义镜像构建或文件构建选项从本地源而不是从 Git 存储库构建和部署。

先决条件

  • 安装了 RHPAM Kogito Operator。
  • 您红帽构建的 Kogito 微服务的应用位于可从 OpenShift 环境访问的 Git 存储库中。
  • 您可以使用必要的权限访问 OpenShift Web 控制台,以创建和编辑 KogitoBuildKogitoRuntime
  • (仅限红帽构建的 Quarkus)项目的 pom.xml 文件,包含以下对 quarkus-smallrye-health 扩展名的依赖项。此扩展支持 OpenShift 上红帽构建 Quarkus 项目所需的 存活度和就绪度探测

    Red Hat build of Quarkus applications on OpenShift

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-smallrye-health</artifactId>
    </dependency>

流程

  1. 进入 OperatorsInstalled Operators,再选择 RHPAM Kogito Operator
  2. 要创建 Kogito 构建定义的红帽构建,请在 operator 页面中选择 Kogito Build 选项卡,然后点 Create KogitoBuild
  3. 在应用程序窗口中,使用 Form ViewYAML View 来配置构建定义。

    至少,定义以下示例 YAML 文件中的应用程序配置:

    使用红帽构建 Kogito 构建的红帽构建的 Quarkus 应用程序的 YAML 定义

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this service
    kind: KogitoBuild  # Application type
    metadata:
      name: example-quarkus  # Application name
    spec:
      type: RemoteSource
      gitSource:
        uri: 'https://github.com/kiegroup/kogito-examples'  # Git repository containing application (uses default branch)
        contextDir: dmn-quarkus-example  # Git folder location of application

    使用 Red Hat build of Kogito build 的 Spring Boot 应用程序的 YAML 定义示例

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this service
    kind: KogitoBuild  # Application type
    metadata:
      name: example-springboot  # Application name
    spec:
      runtime: springboot
      type: RemoteSource
      gitSource:
        uri: 'https://github.com/kiegroup/kogito-examples'  # Git repository containing application (uses default branch)
        contextDir: dmn-springboot-example  # Git folder location of application

    注意

    如果您配置了内部 Maven 存储库,您可以将其用作 Maven 镜像服务,并在红帽构建的 Kogito build 定义中指定 Maven 镜像 URL,以大大缩短构建时间:

    spec:
      mavenMirrorURL: http://nexus3-nexus.apps-crc.testing/repository/maven-public/

    有关内部 Maven 存储库的更多信息,请参阅 Apache Maven 文档。

  4. 定义应用程序数据后,点 Create 来生成 Kogito 构建的红帽构建。

    您的应用程序 在红帽构建的 KogitoBuilds 页面中列出。您可以选择应用程序名称来查看或修改应用程序设置和 YAML 详情。

  5. 要创建 Kogito 微服务定义的红帽构建,请在 operator 页面中选择 Kogito Runtime 选项卡,然后单击 Create KogitoRuntime
  6. 在应用窗口中,使用 Form ViewYAML View 来配置微服务定义。

    至少,定义以下示例 YAML 文件中的应用程序配置:

    红帽构建的带有 Kogito 微服务的 Quarkus 应用程序的 YAML 定义

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
    kind: KogitoRuntime  # Application type
    metadata:
      name: example-quarkus  # Application name

    使用红帽构建 Kogito 微服务的 Spring Boot 应用程序的 YAML 定义示例

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
    kind: KogitoRuntime  # Application type
    metadata:
      name: example-springboot  # Application name
    spec:
      runtime: springboot

    注意

    在这种情况下,应用程序从 Git 构建并使用 KogitoRuntime 进行部署。您必须确保在 KogitoBuildKogitoRuntime 中应用程序名称相同。

  7. 定义应用程序数据后,单击 Create 以生成红帽构建 Kogito 微服务。

    您的应用在红帽构建的 Kogito 微服务页面中列出。您可以选择应用程序名称来查看或修改应用程序设置以及 YAML 文件的内容。

  8. 在 Web 控制台的左侧菜单中,进入 Builds → Builds 来查看应用程序构建的状态。

    您可以选择特定的构建来查看构建详情。

    注意

    对于您为 OpenShift 部署创建的 Kogito 微服务的每个红帽构建,会在 web 控制台中的 Builds 页面中生成并列出两个构建:传统的运行时构建以及带有后缀 -builder 的 Source-to-Image (S2I)构建。S2I 机制在 OpenShift 构建中构建应用,然后将构建的应用传递到下一 OpenShift 构建,以打包到运行时容器镜像。Red Hat build of Kogito S2I 构建配置还允许您直接从 OpenShift 平台上的 Git 存储库构建项目。

  9. 应用程序构建完成后,进入 WorkloadsDeployments 以查看应用程序部署、pod 状态和其他详情。
  10. 部署红帽构建 Kogito 微服务后,在 Web 控制台的左侧菜单中,前往 NetworkingRoutes 来查看对部署的应用程序的访问链接。

    您可以选择应用程序名称来查看或修改路由设置。

    通过应用程序路由,您可以根据需要将红帽构建 Kogito 微服务与业务自动化解决方案集成。

OpenShift 构建可能需要大量时间。作为在 OpenShift 中构建和部署红帽构建的 Kogito 微服务的更快替代方案,您可以使用二进制构建。

操作器使用以下自定义资源来部署域特定的微服务(您开发的微服务):

  • KogitoBuild 处理上传的应用并生成运行时镜像。
  • KogitoRuntime 启动运行时镜像,并根据您的要求进行配置。

先决条件

  • 安装了 RHPAM Kogito Operator。
  • oc OpenShift CLI 已安装,您已登录到相关的 OpenShift 集群。有关 oc 安装和登录说明,请参阅 OpenShift 文档
  • 您可以使用必要的权限访问 OpenShift Web 控制台,以创建和编辑 KogitoBuildKogitoRuntime
  • (仅限红帽构建的 Quarkus)项目的 pom.xml 文件,包含以下对 quarkus-smallrye-health 扩展名的依赖项。此扩展支持 OpenShift 上红帽构建 Quarkus 项目所需的 存活度和就绪度探测

    Red Hat build of Quarkus applications on OpenShift

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-smallrye-health</artifactId>
    </dependency>

流程

  1. 本地构建应用。
  2. 进入 OperatorsInstalled Operators,再选择 RHPAM Kogito Operator
  3. 要创建 Kogito 构建定义的红帽构建,请在 operator 页面中选择 Kogito Build 选项卡,然后点 Create KogitoBuild
  4. 在应用程序窗口中,使用 Form ViewYAML View 来配置构建定义。

    至少,定义以下示例 YAML 文件中的应用程序配置:

    使用红帽构建 Kogito 构建的红帽构建的 Quarkus 应用程序的 YAML 定义

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this service
    kind: KogitoBuild  # Application type
    metadata:
      name: example-quarkus  # Application name
    spec:
      type: Binary

    使用 Red Hat build of Kogito build 的 Spring Boot 应用程序的 YAML 定义示例

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this service
    kind: KogitoBuild  # Application type
    metadata:
      name: example-springboot  # Application name
    spec:
      runtime: springboot
      type: Binary

  5. 定义应用程序数据后,点 Create 来生成 Kogito 构建的红帽构建。

    您的应用程序 在红帽构建的 KogitoBuilds 页面中列出。您可以选择应用程序名称来查看或修改应用程序设置和 YAML 详情。

  6. 使用以下命令上传构建的二进制文件:

    $ oc start-build example-quarkus --from-dir=target/ -n namespace
    • from-dir 等于 构建应用程序的目标文件夹路径。
    • namespace 是创建 KogitoBuild 的命名空间。
  7. 要创建 Kogito 微服务定义的红帽构建,请在 operator 页面中选择 Kogito Runtime 选项卡,然后单击 Create KogitoRuntime
  8. 在应用窗口中,使用 Form ViewYAML View 来配置微服务定义。

    至少,定义以下示例 YAML 文件中的应用程序配置:

    红帽构建的带有 Kogito 微服务的 Quarkus 应用程序的 YAML 定义

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
    kind: KogitoRuntime  # Application type
    metadata:
      name: example-quarkus  # Application name

    使用红帽构建 Kogito 微服务的 Spring Boot 应用程序的 YAML 定义示例

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
    kind: KogitoRuntime  # Application type
    metadata:
      name: example-springboot  # Application name
    spec:
      runtime: springboot

    注意

    在这种情况下,应用程序使用 KogitoRuntime 在本地构建并进行部署。您必须确保在 KogitoBuildKogitoRuntime 中应用程序名称相同。

  9. 定义应用程序数据后,单击 Create 以生成红帽构建 Kogito 微服务。

    您的应用在红帽构建的 Kogito 微服务页面中列出。您可以选择应用程序名称来查看或修改应用程序设置以及 YAML 文件的内容。

  10. 在 Web 控制台的左侧菜单中,进入 Builds → Builds 来查看应用程序构建的状态。

    您可以选择特定的构建来查看构建详情。

  11. 应用程序构建完成后,进入 WorkloadsDeployments 以查看应用程序部署、pod 状态和其他详情。
  12. 部署红帽构建 Kogito 微服务后,在 Web 控制台的左侧菜单中,前往 NetworkingRoutes 来查看对部署的应用程序的访问链接。

    您可以选择应用程序名称来查看或修改路由设置。

    通过应用程序路由,您可以根据需要将红帽构建 Kogito 微服务与业务自动化解决方案集成。

您可以使用自定义镜像构建作为在 OpenShift 中构建和部署红帽构建红帽构建的替代选择。

操作器使用以下自定义资源来部署域特定的微服务(您开发的微服务):

  • KogitoRuntime 启动运行时镜像,并根据您的要求进行配置。

先决条件

  • 安装了 RHPAM Kogito Operator。
  • 您可以使用必要的权限访问 OpenShift Web 控制台,以创建和编辑 KogitoRuntime
  • (仅限红帽构建的 Quarkus)项目的 pom.xml 文件,包含以下对 quarkus-smallrye-health 扩展名的依赖项。此扩展支持 OpenShift 上红帽构建 Quarkus 项目所需的 存活度和就绪度探测

    Red Hat build of Quarkus applications on OpenShift

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-smallrye-health</artifactId>
    </dependency>

流程

  1. 本地构建应用。
  2. 在项目根文件夹中创建 Containerfile,其内容如下:

    红帽构建的 Quarkus 应用程序的 Containerfile 示例

    FROM registry.redhat.io/rhpam-7/rhpam-kogito-runtime-jvm-rhel8:7.11.0
    
    ENV RUNTIME_TYPE quarkus
    
    COPY target/quarkus-app/lib/ $KOGITO_HOME/bin/lib/
    COPY target/quarkus-app/*.jar $KOGITO_HOME/bin
    COPY target/quarkus-app/app/ $KOGITO_HOME/bin/app/
    COPY target/quarkus-app/quarkus/ $KOGITO_HOME/bin/quarkus/

    Spring Boot 应用程序的 Containerfile 示例

    FROM registry.redhat.io/rhpam-7/rhpam-kogito-runtime-jvm-rhel8:7.11.0
    
    ENV RUNTIME_TYPE springboot
    
    COPY target/<application-jar-file> $KOGITO_HOME/bin

    • application-jar-file 是应用的 JAR 文件的名称。
  3. 使用以下命令构建 Kogito 镜像的红帽构建:

    podman build --tag <final-image-name> -f <Container-file>

    在上一命令中,final-image-name 是 Kogito 镜像的红帽构建的名称,Container-file 是您在上一步中创建的 Containerfile 的名称。

  4. 另外,还可使用以下命令测试构建的镜像:

    podman run --rm -it -p 8080:8080 <final-image-name>
  5. 使用以下命令将构建的 Kogito 镜像推送到镜像 registry:

    podman push <final-image-name>
  6. 进入 OperatorsInstalled Operators,再选择 RHPAM Kogito Operator
  7. 要创建 Kogito 微服务定义的红帽构建,请在 operator 页面中选择 Kogito Runtime 选项卡,然后单击 Create KogitoRuntime
  8. 在应用窗口中,使用 Form ViewYAML View 来配置微服务定义。

    至少,定义以下示例 YAML 文件中的应用程序配置:

    红帽构建的带有 Kogito 微服务的 Quarkus 应用程序的 YAML 定义

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
    kind: KogitoRuntime # Application type
    metadata:
      name: example-quarkus # Application name
    spec:
      image: <final-image-name> # Kogito image name
      insecureImageRegistry: true # Can be omitted when image is pushed into secured registry with valid certificate

    使用红帽构建 Kogito 微服务的 Spring Boot 应用程序的 YAML 定义示例

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
    kind: KogitoRuntime # Application type
    metadata:
      name: example-springboot # Application name
    spec:
      image: <final-image-name> # Kogito image name
      insecureImageRegistry: true # Can be omitted when image is pushed into secured registry with valid certificate
      runtime: springboot

  9. 定义应用程序数据后,单击 Create 以生成红帽构建 Kogito 微服务。

    您的应用在红帽构建的 Kogito 微服务页面中列出。您可以选择应用程序名称来查看或修改应用程序设置以及 YAML 文件的内容。

  10. 应用程序构建完成后,进入 WorkloadsDeployments 以查看应用程序部署、pod 状态和其他详情。
  11. 部署红帽构建 Kogito 微服务后,在 Web 控制台的左侧菜单中,前往 NetworkingRoutes 来查看对部署的应用程序的访问链接。

    您可以选择应用程序名称来查看或修改路由设置。

    通过应用程序路由,您可以根据需要将红帽构建 Kogito 微服务与业务自动化解决方案集成。

您可以从单个文件(如决策模型和符号(DMN)、Drools Rule Language (DRL)或属性文件)构建和部署红帽构建 Kogito 微服务。您可以从本地文件系统路径指定一个文件,或者只指定本地文件系统路径中的文件目录。将文件或目录上传到 OpenShift 集群时,会自动触发新的 Source-to-Image (S2I)构建。

操作器使用以下自定义资源来部署域特定的微服务(您开发的微服务):

  • KogitoBuild 从文件生成应用程序,并生成运行时镜像。
  • KogitoRuntime 启动运行时镜像,并根据您的要求进行配置。

先决条件

  • 安装了 RHPAM Kogito Operator。
  • oc OpenShift CLI 已安装,您已登录到相关的 OpenShift 集群。有关 oc 安装和登录说明,请参阅 OpenShift 文档
  • 您可以使用必要的权限访问 OpenShift Web 控制台,以创建和编辑 KogitoBuildKogitoRuntime

流程

  1. 进入 OperatorsInstalled Operators,再选择 RHPAM Kogito Operator
  2. 要创建 Kogito 构建定义的红帽构建,请在 operator 页面中选择 Kogito Build 选项卡,然后点 Create KogitoBuild
  3. 在应用程序窗口中,使用 Form ViewYAML View 来配置构建定义。

    至少,定义以下示例 YAML 文件中的应用程序配置:

    使用红帽构建 Kogito 构建的红帽构建的 Quarkus 应用程序的 YAML 定义

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this service
    kind: KogitoBuild  # Application type
    metadata:
      name: example-quarkus  # Application name
    spec:
      type: LocalSource

    使用 Red Hat build of Kogito build 的 Spring Boot 应用程序的 YAML 定义示例

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this service
    kind: KogitoBuild  # Application type
    metadata:
      name: example-springboot  # Application name
    spec:
      runtime: springboot
      type: LocalSource

    注意

    如果您配置了内部 Maven 存储库,您可以将其用作 Maven 镜像服务,并在红帽构建的 Kogito build 定义中指定 Maven 镜像 URL,以大大缩短构建时间:

    spec:
      mavenMirrorURL: http://nexus3-nexus.apps-crc.testing/repository/maven-public/

    有关内部 Maven 存储库的更多信息,请参阅 Apache Maven 文档。

  4. 定义应用程序数据后,点 Create 来生成 Kogito 构建的红帽构建。

    您的应用程序 在红帽构建的 KogitoBuilds 页面中列出。您可以选择应用程序名称来查看或修改应用程序设置和 YAML 详情。

  5. 使用以下命令上传文件资产:

    $ oc start-build example-quarkus-builder --from-file=<file-asset-path> -n namespace
    • file-asset-path 是您要上传的文件资产的路径。
    • namespace 是创建 KogitoBuild 的命名空间。
  6. 要创建 Kogito 微服务定义的红帽构建,请在 operator 页面中选择 Kogito Runtime 选项卡,然后单击 Create KogitoRuntime
  7. 在应用窗口中,使用 Form ViewYAML View 来配置微服务定义。

    至少,定义以下示例 YAML 文件中的应用程序配置:

    红帽构建的带有 Kogito 微服务的 Quarkus 应用程序的 YAML 定义

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
    kind: KogitoRuntime  # Application type
    metadata:
      name: example-quarkus  # Application name

    使用红帽构建 Kogito 微服务的 Spring Boot 应用程序的 YAML 定义示例

    apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
    kind: KogitoRuntime  # Application type
    metadata:
      name: example-springboot  # Application name
    spec:
      runtime: springboot

    注意

    在这种情况下,应用程序是从一个文件构建的,并使用 KogitoRuntime 进行部署。您必须确保在 KogitoBuildKogitoRuntime 中应用程序名称相同。

  8. 定义应用程序数据后,单击 Create 以生成红帽构建 Kogito 微服务。

    您的应用在红帽构建的 Kogito 微服务页面中列出。您可以选择应用程序名称来查看或修改应用程序设置以及 YAML 文件的内容。

  9. 在 Web 控制台的左侧菜单中,进入 Builds → Builds 来查看应用程序构建的状态。

    您可以选择特定的构建来查看构建详情。

    注意

    对于您为 OpenShift 部署创建的 Kogito 微服务的每个红帽构建,会在 web 控制台中的 Builds 页面中生成并列出两个构建:传统的运行时构建以及带有后缀 -builder 的 Source-to-Image (S2I)构建。S2I 机制在 OpenShift 构建中构建应用,然后将构建的应用传递到下一 OpenShift 构建,以打包到运行时容器镜像。

  10. 应用程序构建完成后,进入 WorkloadsDeployments 以查看应用程序部署、pod 状态和其他详情。
  11. 部署红帽构建 Kogito 微服务后,在 Web 控制台的左侧菜单中,前往 NetworkingRoutes 来查看对部署的应用程序的访问链接。

    您可以选择应用程序名称来查看或修改路由设置。

    通过应用程序路由,您可以根据需要将红帽构建 Kogito 微服务与业务自动化解决方案集成。

第 11 章 红帽构建的 Kogito 服务属性配置

部署红帽构建 Kogito 微服务时,会为红帽构建的 Kogito 微服务的 application.properties 配置创建一个 configMap 资源。

configMap 资源的名称由 Red Hat build of Kogito microservice 和 suffix -properties 组成,如下例所示:

在红帽构建 Kogito 微服务部署期间生成的 configMap 资源示例

kind: ConfigMap
apiVersion: v1
metadata:
  name: kogito-travel-agency-properties
data:
  application.properties : |-
    property1=value1
    property2=value2

configMap 资源的 application.properties 数据挂载到红帽构建的 Kogito 微服务的卷中。您添加到 application.properties 部分的任何运行时属性会覆盖红帽构建的 Kogito 微服务的默认应用程序配置属性。

configMapapplication.properties 数据被改变时,滚动更新会修改红帽构建的 Kogito 微服务的部署和配置。

Red Hat OpenShift Container Platform 中的探测验证应用程序是否正常工作或需要重启它。对于红帽构建的 Quarkus 和 Spring Boot 的 Kogito 微服务,探测使用 HTTP 请求与应用程序交互,默认为通过扩展公开的端点。因此,要在 Red Hat OpenShift Container Platform 上运行 Kogito 微服务的红帽构建,您必须导入扩展来为 存活度、就绪度和启动探测 提供应用程序可用性信息。

您可以为红帽构建的 Kogito 服务添加健康检查扩展,这些服务基于 Red Hat OpenShift Container Platform 上红帽构建的 Quarkus。

流程

在命令终端中,导航到项目的 pom.xml 文件,再为 quarkus-smallrye-health 扩展添加以下依赖项:

Red Hat OpenShift Container Platform 上构建的 Quarkus 应用程序小的健康状况依赖

<dependencies>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-smallrye-health</artifactId>
  </dependency>
</dependencies>

您可以为基于 Red Hat OpenShift Container Platform 上的 Spring Boot 的 Kogito 微服务添加健康检查扩展。

流程

在命令终端中,导航到项目的 pom.xml 文件,并添加以下 Spring Boot actuator 依赖项:

Red Hat OpenShift Container Platform 上的 Spring Boot 应用程序 Spring Boot actuator 依赖项

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
</dependencies>

您还可以为存活度、就绪度和启动探测配置自定义端点。

流程

  1. 在项目的 KogitoRuntime YAML 文件中定义探测,如下例所示:

红帽使用自定义探测端点构建 Kogito 微服务自定义资源示例

apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this service
kind: KogitoRuntime
metadata:
  name: process-quarkus-example # Application name
spec:
  replicas: 1
  probes:
    livenessProbe:
      httpGet:
        path: /probes/live # Liveness endpoint
        port: 8080
    readinessProbe:
      httpGet:
        path: /probes/ready # Readiness endpoint
        port: 8080
    startupProbe:
      tcpSocket:
        port: 8080

红帽在 Red Hat Decision Manager 中构建 Kogito,它提供了一个 monitoring-prometheus-addon 附加组件,可为红帽构建 Kogito 微服务启用 Prometheus 指标监控,并生成使用附加组件导出的默认指标的 Grafana 仪表板。RHPAM Kogito Operator 使用 Prometheus Operator 来提取 Prometheus 中的指标。由于这个依赖项,Prometheus Operator 必须安装在与项目相同的命名空间中。

如果要为 Kogito 微服务的红帽构建启用 Prometheus 指标监控,请将以下内容添加到项目中的 pom.xml 文件中,具体取决于您使用的框架:

Prometheus Red Hat build of Quarkus 附加组件的依赖项

<dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>monitoring-prometheus-quarkus-addon</artifactId>
</dependency>

Prometheus Spring Boot 附加组件的依赖项

<dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>monitoring-prometheus-springboot-addon</artifactId>
</dependency>

当您部署使用 monitoring-prometheus-addon 附加组件和安装 Prometheus Operator 的 Kogito 微服务的红帽构建时,Red Hat Process Automation Manager Kogito Operator 会创建一个 ServiceMonitor 自定义资源来公开 Prometheus 的指标,如下例所示:

Prometheus 的 ServiceMonitor 资源示例

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: onboarding-service
  name: onboarding-service
  namespace: kogito
spec:
  endpoints:
  - path: /metrics
    targetPort: 8080
    scheme: http
  namespaceSelector:
    matchNames:
    - kogito
  selector:
    matchLabels:
      app: onboarding-service

您必须手动配置由 Prometheus Operator 管理的 Prometheus 自定义资源,以选择 ServiceMonitor 资源:

Prometheus 资源示例

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
spec:
  serviceAccountName: prometheus
  serviceMonitorSelector:
    matchLabels:
      app: dmn-drools-quarkus-metrics-service

使用 ServiceMonitor 资源配置 Prometheus 资源后,您可以在 Prometheus web 控制台的 Targets 页面中看到 Prometheus 提取的端点。红帽决策管理器服务公开的指标会出现在 Graph 视图中。

RHPAM Kogito Operator 还会为附加组件生成的每个 Grafana 仪表板创建一个 GrafanaDashboard 自定义资源。https://operatorhub.io/operator/grafana-operator仪表板的 app 标签是部署的红帽构建 Kogito 微服务的名称。您必须根据相关的红帽构建 Kogito 微服务来设置 Grafana 自定义资源的 dashboardLabelSelector 属性。

Grafana 资源示例

apiVersion: integreatly.org/v1alpha1
kind: Grafana
metadata:
  name: example-grafana
spec:
  ingress:
    enabled: true
  config:
    auth:
      disable_signout_menu: true
    auth.anonymous:
      enabled: true
    log:
      level: warn
      mode: console
    security:
      admin_password: secret
      admin_user: root
  dashboardLabelSelector:
    - matchExpressions:
        - key: app
          operator: In
          values:
            - my-kogito-application

Red Hat Decision Manager Red Hat build of Kogito Operator 使用 AMQ Streams Operator 自动配置带有 Kafka 的 Kogito 微服务的红帽构建。

当您通过 KogitoInfra 部署启用基础架构机制时,红帽决策管理器 红帽构建的 Kogito Operator 会使用相关的第三方操作器来配置基础架构。

您必须定义自定义基础架构资源,并在 KogitoInfra 文件中链接它。您可以在 spec.resource. name 和 spec.resource.namespace 配置中指定您的自定义基础架构资源。

Red Hat Decision Manager 红帽为自定义消息传递构建 Kogito 基础架构资源示例

apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
kind: KogitoInfra # Application type
metadata:
  name: my-kafka-infra
spec:
  resource:
    apiVersion: kafka.strimzi.io/v1beta2 # AMQ Streams API
    kind: Kafka	# AMQ Streams Application Type
    name: my-kafka-instance
    namespace: my-namespace

在本例中,ko gitoInfra 自定义资源从 my-namespace 连接到 my-namespace 中的 Kafka 集群 my-kafka-instance 以进行事件消息传递。

要将 Red Hat build of Kogito 微服务连接到 Kafka,您需要定义 infra 配置以使用对应的基础架构。

红帽使用消息传递构建 Kogito 微服务资源配置示例

apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
kind: KogitoRuntime # Application type
metadata:
  name: example-quarkus # Application name
spec:
  image: <final-image-name> # Kogito image name
  insecureImageRegistry: true # Can be omitted when image is pushed into secured registry with valid certificate
  infra:
  - my-kafka-infra

Red Hat Decision Manager Red Hat build of Kogito Operator 会配置必要的属性,以便您的应用程序可以连接到 Kafka 实例。

使用本节中的信息来排除在使用操作器部署 Kogito 微服务的红帽构建时可能会遇到的问题。发现新问题以及发现临时解决方案时,会更新以下信息。

没有构建正在运行

如果没有看到任何运行构建以及相关命名空间中创建的任何资源,请输入以下命令检索正在运行的 pod,并查看 pod 的 Operator 日志:

查看指定 pod 的 RHPAM Kogito Operator 日志

// Retrieves running pods
$ oc get pods

NAME                                     READY   STATUS      RESTARTS   AGE
kogito-operator-6d7b6d4466-9ng8t   1/1     Running     0          26m

// Opens RHPAM Kogito Operator log for the pod
$ oc logs -f kogito-operator-6d7b6d4466-9ng8t

验证 KogitoRuntime 状态

如果您创建,例如,使用以下 YAML 定义使用带有不存在的镜像的 KogitoRuntime 应用程序:

KogitoRuntime 应用程序的 YAML 定义示例

apiVersion: rhpam.kiegroup.org/v1 # Red Hat build of Kogito API for this microservice
kind: KogitoRuntime # Application type
metadata:
  name: example # Application name
spec:
  image: 'not-existing-image:latest'
  replicas: 1

您可以使用 bash 控制台中的 oc describe KogitoRuntime example 命令验证 KogitoRuntime 应用程序的状态。当您在 bash 控制台中运行 oc describe KogitoRuntime 示例 命令时,您会收到以下输出:

KogitoRuntime 状态示例

[user@localhost ~]$ oc describe KogitoRuntime example
Name:         example
Namespace:    username-test
Labels:       <none>
Annotations:  <none>
API Version:  rhpam.kiegroup.org/v1
Kind:         KogitoRuntime
Metadata:
  Creation Timestamp:  2021-05-20T07:19:41Z
  Generation:          1
  Managed Fields:
    API Version:  rhpam.kiegroup.org/v1
    Fields Type:  FieldsV1
    fieldsV1:
      f:spec:
        .:
        f:image:
        f:replicas:
    Manager:      Mozilla
    Operation:    Update
    Time:         2021-05-20T07:19:41Z
    API Version:  rhpam.kiegroup.org/v1
    Fields Type:  FieldsV1
    fieldsV1:
      f:spec:
        f:monitoring:
        f:probes:
          .:
          f:livenessProbe:
          f:readinessProbe:
        f:resources:
        f:runtime:
      f:status:
        .:
        f:cloudEvents:
        f:conditions:
    Manager:         main
    Operation:       Update
    Time:            2021-05-20T07:19:45Z
  Resource Version:  272185
  Self Link:         /apis/rhpam.kiegroup.org/v1/namespaces/ksuta-test/kogitoruntimes/example
  UID:               edbe0bf1-554e-4523-9421-d074070df982
Spec:
  Image:     not-existing-image:latest
  Replicas:  1
Status:
  Cloud Events:
  Conditions:
    Last Transition Time:  2021-05-20T07:19:44Z
    Message:
    Reason:                NoPodAvailable
    Status:                False
    Type:                  Deployed
    Last Transition Time:  2021-05-20T07:19:44Z
    Message:
    Reason:                RequestedReplicasNotEqualToAvailableReplicas
    Status:                True
    Type:                  Provisioning
    Last Transition Time:  2021-05-20T07:19:45Z
    Message:               you may not have access to the container image "quay.io/kiegroup/not-existing-image:latest"
    Reason:                ImageStreamNotReadyReason
    Status:                True
    Type:                  Failed

在输出的末尾,您可以看到带有相关消息的 KogitoRuntime 状态。

部分 III. 迁移到红帽构建 Kogito 微服务

作为业务决策和流程的开发人员,您可以将红帽决策管理器中的决策服务迁移到红帽构建 Kogito 微服务。在进行迁移时,您的现有业务决策将成为您自己的域特定云原生服务集的一部分。您可以迁移决策模型和表示法(DMN)模型、预测模型标记语言(PMML)模型或 Drools 规则语言(DRL)规则。

先决条件

  • 已安装了 JDK 11 或更高版本。
  • 已安装 Apache Maven 3.6.2 或更高版本。

您可以将您在 Business Central 中开发的决策服务工件迁移到红帽构建 Kogito 微服务。红帽构建的 Kogito 目前支持在以下类型的决策服务的迁移:

  • 决策模型和符号(DMN)模型 : 您可以通过将 DMN 资源从 KJAR 工件移到相应的红帽构建 Kogito archetype 来迁移基于 DMN 的决策服务。
  • 预测模型(PMML)模型 :通过将 PMML 的预测和预测服务从 KJAR 工件移到相应的红帽构建,来迁移基于 PMML 的预测和预测服务。
  • Drools Rule Language (DRL)规则 :您可以在红帽构建的 Quarkus REST 端点中迁移基于 DRL 的决策服务。这种迁移方法可让您使用主要 Quarkus 功能,如热重新加载和原生编译。Quarkus 功能和 Red Hat build of Kogito 的编程模型启用自动生成 Quarkus REST 端点,以便在您的应用程序和服务中实施。

您可以通过将 DMN 资源从 KJAR 工件移到相应的红帽构建 Kogito 项目,将基于 DMN 的决策服务迁移到红帽构建 Kogito 微服务。在红帽构建的 Kogito 微服务中,不再需要一些 KIE v7 功能。

17.1. 主要变化和迁移注意事项

下表描述了影响从 KIE Server API 和 KJAR 迁移到红帽构建 Kogito 部署的主要变化和功能:

Expand
表 17.1. DMN 迁移注意事项
功能In KIE Server API在 Red Hat build of Kogito 工件中

DMN 模型

存储在 KJAR 的 src/main/resources 中。

以 用户身份复制到 src/main/resources

KIE Server generic marshalling 所需的对象模型(POJO)

使用 Business Central 中的数据模型对象编辑器进行管理。

对象模型编辑不再需要。

DMNRuntimeListener

使用系统属性或 kmodule.xml 文件进行配置。

必须使用 CDI 配置,使用 CDI 的 @ApplicationScope 注解来注解 DMNRuntimeEventListener

其他配置选项

使用系统属性或 kmodule.xml 文件进行配置。

除了 DMNRuntimeEventListener 外,只考虑默认值,且不支持覆盖配置。

KIE Server Client API

与对象模型一起使用,与 KIE 服务器上部署的 KJAR 交互。

对于对象模型,不再需要此功能。

注意

您可以选择您自己的 REST 库选择。

REST API

当在 KIE 服务器上部署 KJAR 时,与特定 DMN 模型端点交互的应用程序时,在红帽构建 Kogito 部署中使用相同的 API。

高级支持特定的 DMN 模型生成。如需更多信息,请参阅 DMN 模型执行

测试场景

使用 JUnit activator 运行。

类似于 JUnit activator 在红帽构建的 Kogito 上提供。

注意

上表中未提及的功能在云原生红帽构建 Kogito 部署中不受支持或不需要。

17.2. 迁移策略

将 DMN 项目迁移到 Kogito 项目的红帽构建时,您可以首先迁移与 KIE 服务器上决策服务交互的外部应用程序。您可以使用特定于 DMN 模型的 REST 端点。使用 REST 端点后,您可以将外部应用程序从 KIE 服务器迁移到红帽构建 Kogito 部署。有关对 DMN 模型的特定 REST 端点的更多信息,请参阅特定 DMN 模型的 REST 端点

迁移策略包括以下步骤:

  1. 使用 KIE 服务器将现有的外部应用从通用 KIE 服务器 API 迁移到特定的 DMN REST 端点。
  2. 将 KJAR 迁移到 KJAR,它将 KIE 服务器部署到红帽构建 Kogito 微服务。
  3. 使用红帽 OpenShift 容器平台部署 Kogito 微服务的红帽构建。
  4. 重新连接外部应用程序,并将来自特定 DMN REST 端点的 REST API 消耗迁移到 Kogito 部署的红帽构建。

要将 DMN 项目迁移到 Kogito 部署的红帽构建,首先,您可以迁移使用特定 DMN REST 端点与 KIE 服务器上的决策服务交互的外部应用程序。

流程

  1. 如果您在外部应用程序中使用 REST 端点,请使用 GET /server/containers/{containerId}/dmn/openapi.json (|.yaml) 端点检索 KJAR 的 Swagger 或 OAS 规格文件。

    有关特定 DMN 模型的 REST 端点的更多信息,请参阅特定 DMN 模型的 REST 端点

  2. 在外部应用程序中,选择 Java 或 JDK 库与决策服务交互。您可以使用特定 KJAR 的 REST 端点与决策服务交互。
注意

迁移到红帽构建 Kogito 部署时不支持 KIE Server Client Java API。

迁移外部应用程序后,您需要将特定于 DMN 模型的 KJAR 迁移到红帽构建 Kogito 微服务。

流程

  1. 为您的红帽构建 Kogito 微服务创建一个 Maven 项目。

    有关创建 Maven 项目的步骤,请参阅为红帽构建的 Kogito 微服务创建 Maven 项目

    Maven 项目创建 Kogito 工件。

  2. 将 KJAR 的 src/main/resources 文件夹中的 DMN 模型复制到 Kogito 工件的 src/main/resources 文件夹。
  3. 将 KJAR 的 src/test/resources 文件夹的测试场景复制到 Kogito 工件的 src/test/resources 文件夹。

    重要

    您需要在项目的 pom.xml 文件中导入红帽构建的 Kogito 依赖项测试场景,并使用 KIE Server REST API 创建 JUnit 激活器。如需更多信息,请参阅使用 测试场景测试决策服务

  4. 运行以下命令,并确保为指定的非出口测试运行测试场景。

    mvn clean install

    运行 Kogito 应用程序的红帽构建后,您可以检索 Swagger 或 OAS 规格文件。Swagger 或 OAS 规格提供与 REST 端点相同的信息,以及以下实现详情:

    • API 可用服务器的基本 URL
    • 引用架构名称

    当外部应用程序重新路由到新 URL 时,您可以使用提供的实现详情。

在将 DMN 模型 KJAR 迁移到红帽构建 Kogito 微服务后,您需要使用 Red Hat OpenShift Container Platform 部署微服务。有关使用 Openshift 的部署选项,请参阅使用 RHPAM Kogito Operator 的 OpenShift 部署选项

以下是将 DMN 模型 KJAR 迁移到红帽构建 Kogito 微服务的示例:

图 17.1. 使用 DMN 模型实施的决策服务示例

DMN 决策服务示例

图 17.2. 使用特定 ItemDefinition 结构的 DMN 模型示例

使用 ItemDefinition 结构的 DMN 决定服务示例

您需要将对象模型(POJO)定义为在 Business Central 中开发的现有 KJAR 中的 DTO。

在 KJAR 中定义为 DTO 的对象模型示例

package com.myspace.demo20210321;

/**
 * This class was automatically generated by the data modeler tool.
 */

public class Reservation implements java.io.Serializable {

	static final long serialVersionUID = 1L;
	@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    @com.fasterxml.jackson.databind.annotation.JsonSerialize(using = com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer.class)
	private java.time.LocalDate checkin;
	@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    @com.fasterxml.jackson.databind.annotation.JsonSerialize(using = com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer.class)
	private java.time.LocalDate checkout;

	private java.util.List<java.lang.String> guests;

	public Reservation() {
	}

	public java.time.LocalDate getCheckin() {
		return this.checkin;
	}

	public void setCheckin(java.time.LocalDate checkin) {
		this.checkin = checkin;
	}

	public java.time.LocalDate getCheckout() {
		return this.checkout;
	}

	public void setCheckout(java.time.LocalDate checkout) {
		this.checkout = checkout;
	}

	public java.util.List<java.lang.String> getGuests() {
		return this.guests;
	}

	public void setGuests(java.util.List<java.lang.String> guests) {
		this.guests = guests;
	}

	public Reservation(java.time.LocalDate checkin,
			java.time.LocalDate checkout,
			java.util.List<java.lang.String> guests) {
		this.checkin = checkin;
		this.checkout = checkout;
		this.guests = guests;
	}

}

在上例中,定义的 DTO 与 KIE Server 客户端 Java API 结合使用。或者,您可以在有效负载中指定 DTO,当非 Java 外部应用程序与在 KIE 服务器上部署的 KJAR 交互时。

使用 KIE Server 客户端 Java API 的示例

DMNServicesClient dmnClient = kieServicesClient.getServicesClient(DMNServicesClient.class);
 DMNContext dmnContext = dmnClient.newContext();
 dmnContext.set("reservation", new com.myspace.demo20210321.Reservation(LocalDate.of(2021, 3, 1),
                                                                         LocalDate.of(2021, 3, 8),
                                                                         Arrays.asList("John", "Alice")));
 run(dmnClient, dmnContext);

图 17.3. 在有效负载中手动指定 DTO 的示例

手动部署的 KJAR 示例
注意

在上例中,REST API 中对象模型的 FQCN 用于通用 KIE Server marshalling。

部署红帽构建 Kogito 微服务后,您需要将外部应用绑定到红帽构建 Kogito 微服务部署。

绑定外部应用程序包括重新显示外部应用程序,并将应用程序绑定到与红帽构建 Kogito 应用程序关联的服务器的新基本 URL。如需更多信息,请参阅以下示例:

图 17.4. KIE 服务器上的 KJAR 的 /discount REST 端点示例

KIE 服务器上 KJAR 的特定 DMN 模型特定 REST 端点示例

图 17.5. 在本地红帽构建的 Kogito 上 /discount REST 端点示例

在本地 Kogito 应用程序上运行的 DMN 模型特定的 REST 端点示例

图 17.6. 绑定到 Red Hat build of Kogito 的新基础 URL 示例 /discount REST 端点

带有新基础 URL 的 DMN 模型特定 REST 端点示例

您可以将基于 PMML 的服务迁移到 Kogito 微服务的 Red Hat build of Kogito 微服务,方法是将 PMML 资源从 KJAR 工件移到相应的红帽构建 Kogito 项目中。

18.1. 主要变化和迁移注意事项

下表描述了影响从 KIE Server API 和 KJAR 迁移到红帽构建 Kogito 部署的主要变化和功能:

Expand
表 18.1. PMML 迁移注意事项
功能In KIE Server API在 Red Hat build of Kogito 工件中

PMML 模型

存储在 KJAR 的 src/main/resources 中。

以 用户身份复制到 src/main/resources

其他配置选项

使用系统属性或 kmodule.xml 文件进行配置。

仅考虑默认值,且不支持覆盖配置。

基于命令的 REST API

使用 ApplyPmmlModelCommand 请求 PMML 评估。

不支持。

域驱动的 REST API

不支持。

特定于 PMML 模型的生成高级支持。

注意

上表中未提及的功能在云原生红帽构建 Kogito 部署中不受支持或不需要。

18.2. 迁移策略

迁移策略包括以下步骤:

  1. 将 KJAR 迁移到 KJAR,它将 KIE 服务器部署到红帽构建 Kogito 微服务。
  2. 使用红帽 OpenShift 容器平台部署 Kogito 微服务的红帽构建。
  3. 将 KIE 服务器上的客户端 PMML API 的外部应用程序修改为红帽构建的 Kogito 部署的 REST API。

您可以将使用 PMML 模型实施的 KJAR 迁移到红帽构建 Kogito 微服务。

流程

  1. 为您的红帽构建 Kogito 微服务创建一个 Maven 项目。

    有关创建 Maven 项目的步骤,请参阅为红帽构建的 Kogito 微服务创建 Maven 项目

    Maven 项目创建 Kogito 工件。

  2. 将 KJAR 的 src/main/resources 文件夹的 PMML 模型复制到 Kogito 工件的 src/main/resources 文件夹。
  3. 运行以下命令来执行 Kogito 应用程序的红帽构建:

    mvn clean install

    运行 Kogito 应用程序的红帽构建后,您可以检索 Swagger 或 OAS 规格文件。Swagger 或 OAS 规格提供与 REST 端点相同的信息,以及以下实现详情:

    • API 可用服务器的基本 URL
    • 引用架构名称

    当外部应用程序重新路由到新 URL 时,您可以使用提供的实现详情。

在将 PMML 模型 KJAR 迁移到 Kogito 微服务的红帽构建后,您需要使用 Red Hat OpenShift Container Platform 部署微服务。有关使用 Openshift 的部署选项,请参阅使用 RHPAM Kogito Operator 的 OpenShift 部署选项

18.4. 将外部应用修改为红帽构建 Kogito 微服务

部署 PMML 微服务后,您需要将外部应用修改为红帽构建 Kogito 部署。

先决条件

  • 原始的外部应用程序必须在 KIE 服务器客户端 API 中实施。

    图 18.1. KIE Server 上的外部应用程序实施示例

    KIE 服务器上外部应用程序实施的屏幕截图

流程

  1. 删除 KIE 服务器客户端 API 的所有使用,并将其替换为 HTTP 通信。以下是非 Java 请求的示例:

    非java 请求示例
  2. 确保外部应用中使用任何 HTTP 客户端 Java 库来创建类似的调用并解析结果。

    以下是 Java 11 HTTP 客户端和 Gson 的示例,用于将输入数据转换为 JSON:

    Java 11 HTTP 客户端示例
    注意

    因为参数值需要的所有参数都嵌入在调用的 URL 中。

您可以在 Kogito 的红帽构建中构建和部署示例项目,以便在红帽构建的 Quarkus REST 端点中公开决策引擎的无状态规则评估,并将 REST 端点迁移到红帽构建 Kogito。

无状态规则评估是红帽决策管理器中一组规则集的单次执行,可作为函数调用来标识。在调用的函数中,输出值通过输入值来决定。另外,调用的功能使用决策引擎来执行作业。因此,在这样的情形中,函数使用 REST 端点公开,并转换为微服务。转换为微服务后,函数作为服务环境部署到功能中,从而消除 JVM 启动时间的成本。

19.1. 主要变化和迁移注意事项

下表描述了影响从 KIE Server API 和 KJAR 迁移到红帽构建 Kogito 部署的主要变化和功能:

Expand
表 19.1. DRL 迁移注意事项
功能In KIE Server API在红帽使用旧 API 支持的 Kogito 构建中在 Red Hat build of Kogito 工件中

DRL 文件

存储在 KJAR 的 src/main/resources 文件夹中。

以 用户身份复制到 src/main/resources 文件夹。

使用规则单元和 OOPath 重写。

KieContainer

使用系统属性或 kmodule.xml 文件进行配置。

KieRuntimeBuilder 替代。

不是必需的。

KieBaseKieSession

使用系统属性或 kmodule.xml 文件进行配置。

使用系统属性或 kmodule.xml 文件进行配置。

由规则单元替代。

19.2. 迁移策略

在 Red Hat Decision Manager 中,您可以使用以下两种方式将规则评估迁移到红帽构建 Kogito 部署:

在红帽构建的 Kogito 中使用传统 API
在红帽构建的 Kogito 中,kogito-legacy-api 模块使红帽决策管理器的传统 API 可用,因此 DRL 文件保持不变。迁移规则评估的方法需要最少的更改,并可让您使用主要红帽构建的 Quarkus 功能,如热重新加载和原生镜像创建。
迁移到红帽构建 Kogito 规则单元

迁移到红帽构建 Kogito 规则单元包括红帽构建的 Kogito 编程模型,它基于规则单元的概念。

红帽构建的 Kogito 中的规则单元包括一组规则和事实(与规则匹配)。红帽构建的 Kogito 中的规则单位也附带数据源。规则单元数据源是给定规则单元处理的数据源,代表用于评估规则单元的入口点。规则单元使用两种类型的数据源:

  • datastream :这是仅附加数据源,添加到 DataStream 中的事实无法更新或删除。
  • Datastore :此数据源用于可修改的数据。您可以使用将对象添加到 DataStore 时返回的 FactHandle 更新或删除对象。

总体而言,规则单元包含两个部分:要评估的事实的定义,以及评估事实的规则集合。

19.3. loan 应用程序项目示例

在以下部分中,loan 应用程序项目被用作将 DRL 项目迁移到红帽构建 Kogito 部署的例子。loan 应用程序项目的域模型由两个类组成,即 LoanApplication 类和 Applicant 类:

LoanApplication 类示例

public class LoanApplication {

   private String id;
   private Applicant applicant;
   private int amount;
   private int deposit;
   private boolean approved = false;

   public LoanApplication(String id, Applicant applicant,
                      	int amount, int deposit) {
   	this.id = id;
   	this.applicant = applicant;
   	this.amount = amount;
   	this.deposit = deposit;
   }
}

Applicant 类示例

public class Applicant {

   private String name;
   private int age;

   public Applicant(String name, int age) {
   	this.name = name;
   	this.age = age;
   }
}

规则集使用业务决策创建,以批准或拒绝应用程序,以及收集列表中所有批准的应用程序的最后一个规则。

loan 应用程序中设置的规则示例

global Integer maxAmount;
global java.util.List approvedApplications;

rule LargeDepositApprove when
   $l: LoanApplication( applicant.age >= 20, deposit >= 1000, amount <= maxAmount )
then
   modify($l) { setApproved(true) }; // loan is approved
end

rule LargeDepositReject when
   $l: LoanApplication( applicant.age >= 20, deposit >= 1000, amount > maxAmount )
then
   modify($l) { setApproved(false) }; // loan is rejected
end

// ... more loans approval/rejections business rules ...

rule CollectApprovedApplication when
   $l: LoanApplication( approved )
then
   approvedApplications.add($l); // collect all approved loan applications
end

您可以使用红帽构建的 Quarkus 来公开在 Business Central 中通过 REST 端点开发的规则评估。

流程

  1. 根据包含规则和 Quarkus 库的模块创建新模块,提供 REST 支持:

    创建新模块的依赖项示例

    <dependencies>
    
     <dependency>
       <groupId>io.quarkus</groupId>
       <artifactId>quarkus-resteasy</artifactId>
     </dependency>
     <dependency>
       <groupId>io.quarkus</groupId>
       <artifactId>quarkus-resteasy-jackson</artifactId>
     </dependency>
    
     <dependency>
       <groupId>org.example</groupId>
       <artifactId>drools-project</artifactId>
       <version>1.0-SNAPSHOT</version>
     </dependency>
    
    <dependencies>

  2. 创建 REST 端点。

    以下是创建 REST 端点的设置示例:

    FindApprovedLoansEndpoint 端点设置示例

    @Path("/find-approved")
    public class FindApprovedLoansEndpoint {
    
       private static final KieContainer kContainer = KieServices.Factory.get().newKieClasspathContainer();
    
       @POST()
       @Produces(MediaType.APPLICATION_JSON)
       @Consumes(MediaType.APPLICATION_JSON)
       public List<LoanApplication> executeQuery(LoanAppDto loanAppDto) {
       	KieSession session = kContainer.newKieSession();
    
       	List<LoanApplication> approvedApplications = new ArrayList<>();
       	session.setGlobal("approvedApplications", approvedApplications);
       	session.setGlobal("maxAmount", loanAppDto.getMaxAmount());
    
       	loanAppDto.getLoanApplications().forEach(session::insert);
       	session.fireAllRules();
       	session.dispose();
    
       	return approvedApplications;
       }
    }

    在上例中,会创建一个包含规则的 KieContainer,并添加到 static 字段中。KieContainer 中的规则从类路径中的其他模块获取。使用此方法,您可以重复使用相同的 KieContainer 来处理与 FindApprovedLoansEndpoint 端点相关的后续调用,而无需重新编译规则。

    注意

    在将规则单元迁移到使用传统 API 的 Kogito 微服务的红帽构建过程中,这两个模块将合并。如需更多信息,请参阅 使用旧 API 将 DRL 规则单元迁移到红帽构建的 Kogito 微服务

    当调用 FindApprovedLoansEndpoint 端点时,会从 KieContainer 创建新的 KieSessionKieSession 将填充 LoanAppDto 中由 JSON 请求未组合生成的对象。

    LoanAppDto 类示例

    public class LoanAppDto {
    
       private int maxAmount;
    
       private List<LoanApplication> loanApplications;
    
       public int getMaxAmount() {
       	return maxAmount;
       }
    
       public void setMaxAmount(int maxAmount) {
       	this.maxAmount = maxAmount;
       }
    
       public List<LoanApplication> getLoanApplications() {
       	return loanApplications;
       }
    
       public void setLoanApplications(List<LoanApplication> loanApplications) {
       	this.loanApplications = loanApplications;
       }
    }

    当调用 fireAllRules () 方法时,将触发 KieSession,并根据输入数据评估业务逻辑。在业务逻辑评估后,最后一个规则收集列表中所有批准的应用程序,并返回与输出相同的列表。

  3. 启动红帽构建的 Quarkus 应用程序。
  4. 使用包含要检查的 loan 应用程序的 JSON 请求调用 FindApprovedLoansEndpoint 端点。

    规则中使用 maxAmount 的值,如下例所示:

    curl 请求示例

    curl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"maxAmount":5000,
    "loanApplications":[
    {"id":"ABC10001","amount":2000,"deposit":1000,"applicant":{"age":45,"name":"John"}}, {"id":"ABC10002","amount":5000,"deposit":100,"applicant":{"age":25,"name":"Paul"}}, {"id":"ABC10015","amount":1000,"deposit":100,"applicant":{"age":12,"name":"George"}}
    ]}' http://localhost:8080/find-approved

    JSON 响应示例

    [
      {
        "id": "ABC10001",
        "applicant": {
          "name": "John",
          "age": 45
        },
        "amount": 2000,
        "deposit": 1000,
        "approved": true
      }
    ]

注意

使用此方法,您无法使用热重新加载功能,也不能创建项目的原生镜像。在接下来的步骤中,缺少的 Quarkus 功能由 Kogito 扩展提供,该扩展启用了 Quarkus 了解 DRL 文件,并以类似的方式实施热重新加载功能。

使用 REST 端点公开规则评估后,您可以使用旧 API 将规则评估迁移到红帽构建 Kogito 微服务。

流程

  1. 将以下依赖项添加到项目 pom.xml 文件中,以启用使用红帽构建的 Quarkus 和旧 API:

    使用 Quarkus 和旧 API 的依赖项示例

    <dependencies>
     <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-quarkus-rules</artifactId>
     </dependency>
     <dependency>
      <groupId>org.kie.kogito</groupId>
      <artifactId>kogito-legacy-api</artifactId>
     </dependency>
    </dependencies>

  2. 重写 REST 端点实现:

    REST 端点实施示例

    @Path("/find-approved")
    public class FindApprovedLoansEndpoint {
    
       @Inject
       KieRuntimeBuilder kieRuntimeBuilder;
    
       @POST()
       @Produces(MediaType.APPLICATION_JSON)
       @Consumes(MediaType.APPLICATION_JSON)
       public List<LoanApplication> executeQuery(LoanAppDto loanAppDto) {
       	KieSession session = kieRuntimeBuilder.newKieSession();
    
       	List<LoanApplication> approvedApplications = new ArrayList<>();
       	session.setGlobal("approvedApplications", approvedApplications);
       	session.setGlobal("maxAmount", loanAppDto.getMaxAmount());
    
       	loanAppDto.getLoanApplications().forEach(session::insert);
       	session.fireAllRules();
       	session.dispose();
    
       	return approvedApplications;
       }
    }

    在重写的 REST 端点实施中,而不是从 KieContainer 创建 KieSession,而是使用集成的 KieRuntimeBuilder 自动创建 KieSession

    KieRuntimeBuilder 是由替换 KieContainerkogito-legacy-api 模块提供的接口。使用 KieRuntimeBuilder,您可以像在 KieContainer 中创建的方式创建 KieBasesKieSessions。Red Hat build of Kogito 在编译时自动生成 KieRuntimeBuilder 接口的实现,并将 KieRuntimeBuilder 集成到一个类中,它实现了 FindApprovedLoansEndpoint REST 端点。

  3. 以开发模式启动您的红帽构建的 Quarkus 应用程序。

    您还可以使用热重新加载来对应用到正在运行的应用的规则文件进行更改。另外,您可以创建基于规则的应用程序的原生镜像。

19.3.3. 实施规则单元和自动 REST 端点生成

将规则单元迁移到 Kogito 微服务的红帽构建后,您可以实施规则单元和 REST 端点的自动生成。

在红帽构建的 Kogito 中,规则单元包含一组规则和事实,规则与规则匹配。红帽构建的 Kogito 中的规则单位也附带数据源。规则单元数据源是给定规则单元处理的数据源,代表用于评估规则单元的入口点。规则单元使用两种类型的数据源:

  • datastream :这是仅附加数据源。在 DataStream 中,订阅者收到新的和过去的信息,流可以在被动流中是热或冷的信息。另外,添加到 DataStream 中的事实无法更新或删除。
  • Datastore :此数据源用于可修改的数据。您可以使用将对象添加到 DataStore 时返回的 FactHandle 更新或删除对象。

总体而言,规则单元包含两个部分:要评估的事实的定义,以及评估事实的规则集合。

流程

  1. 使用 POJO 实施事实定义:

    使用 POJO 的事实定义实施示例

    package org.kie.kogito.queries;
    
    import org.kie.kogito.rules.DataSource;
    import org.kie.kogito.rules.DataStore;
    import org.kie.kogito.rules.RuleUnitData;
    
    public class LoanUnit implements RuleUnitData {
    
       private int maxAmount;
       private DataStore<LoanApplication> loanApplications;
    
       public LoanUnit() {
       	this(DataSource.createStore(), 0);
       }
    
       public LoanUnit(DataStore<LoanApplication> loanApplications, int maxAmount) {
       	this.loanApplications = loanApplications;
       	this.maxAmount = maxAmount;
       }
    
       public DataStore<LoanApplication> getLoanApplications() { return loanApplications; }
    
       public void setLoanApplications(DataStore<LoanApplication> loanApplications) {
       	this.loanApplications = loanApplications;
       }
    
       public int getMaxAmount() { return maxAmount; }
       public void setMaxAmount(int maxAmount) { this.maxAmount = maxAmount; }
    }

    在上例中,不使用 LoanAppDto the LoanUnit 类直接绑定。LoanAppDto 用于 marshall 或 unmarshall JSON 请求。另外,前面的示例实现了 org.kie.kogito.rules.RuleUnitData 接口,并使用 DataStore 包含要批准的 loan 应用程序。

    org.kie.kogito.rules.RuleUnitData 是一个标记接口,用于通知决策引擎 LoanUnit 类是规则单元定义的一部分。此外,DataStore 负责允许通过触发新规则并触发其他规则来响应更改。

    另外,规则会修改上例中的 批准 属性。在 contrary 上,maxAmount 值被视为规则单元的配置参数,它不修改。maxAmount 在规则评估过程中自动处理,并从 JSON 请求中传递的值自动设置。

  2. 实施 DRL 文件:

    DRL 文件的实现示例

    package org.kie.kogito.queries;
    unit LoanUnit; // no need to using globals, all variables and facts are stored in the rule unit
    
    rule LargeDepositApprove when
       $l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount <= maxAmount ] // oopath style
    then
       modify($l) { setApproved(true) };
    end
    
    rule LargeDepositReject when
       $l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount > maxAmount ]
    then
       modify($l) { setApproved(false) };
    end
    
    // ... more loans approval/rejections business rules ...
    
    // approved loan applications are now retrieved through a query
    query FindApproved
       $l: /loanApplications[ approved ]
    end

    您创建的 DRL 文件必须声明与事实定义实现相同的软件包,以及一个具有相同 Java 类名称的单元。Java 类实施 RuleUnitData 接口,以声明接口所属的同一规则单元。

    另外,上例中的 DRL 文件会使用 OOPath 表达式重写。在 DRL 文件中,数据源充当入口点,OOPath 表达式包含数据源名称作为 root。但是,约束添加到方括号中,如下所示:

    $L: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount DAEMON maxAmount ]

    或者,您可以使用标准 DRL 语法,您可以在其中将数据源名称指定为入口点。但是,您需要再次指定匹配对象的类型,如下例所示,即使决策引擎可以从数据源中推断类型:

    $L: LoanApplication (applicant.age >= 20, deposit >= 1000, amount FULL maxAmount) from entry-point loanApplications

    在上例中,收集所有批准的 loan 应用程序的最后一个规则会被检索列表的查询替代。规则单元定义要在输入中传递的事实来评估规则,查询则定义规则评估的预期输出。使用此方法,红帽构建的 Kogito 可以自动生成类来执行查询并返回输出,如下例所示:

    LoanUnitQueryFindApproved 类示例

    public class LoanUnitQueryFindApproved implements org.kie.kogito.rules.RuleUnitQuery<List<org.kie.kogito.queries.LoanApplication>> {
    
       private final RuleUnitInstance<org.kie.kogito.queries.LoanUnit> instance;
    
       public LoanUnitQueryFindApproved(RuleUnitInstance<org.kie.kogito.queries.LoanUnit> instance) {
       	this.instance = instance;
       }
    
       @Override
       public List<org.kie.kogito.queries.LoanApplication> execute() {
       	return instance.executeQuery("FindApproved").stream().map(this::toResult).collect(toList());
       }
    
       private org.kie.kogito.queries.LoanApplication toResult(Map<String, Object> tuple) {
       	return (org.kie.kogito.queries.LoanApplication) tuple.get("$l");
       }
    }

    以下是 REST 端点示例,它将规则单元作为输入,并将输入传递给查询 executor 以返回输出:

    LoanUnitQueryFindApprovedEndpoint 端点示例

    @Path("/find-approved")
    public class LoanUnitQueryFindApprovedEndpoint {
    
       @javax.inject.Inject
       RuleUnit<org.kie.kogito.queries.LoanUnit> ruleUnit;
    
       public LoanUnitQueryFindApprovedEndpoint() {
       }
    
       public LoanUnitQueryFindApprovedEndpoint(RuleUnit<org.kie.kogito.queries.LoanUnit> ruleUnit) {
       	this.ruleUnit = ruleUnit;
       }
    
       @POST()
       @Produces(MediaType.APPLICATION_JSON)
       @Consumes(MediaType.APPLICATION_JSON)
       public List<org.kie.kogito.queries.LoanApplication> executeQuery(org.kie.kogito.queries.LoanUnit unit) {
       	RuleUnitInstance<org.kie.kogito.queries.LoanUnit> instance = ruleUnit.createInstance(unit);
       	return instance.executeQuery(LoanUnitQueryFindApproved.class);
       }
    }

    注意

    您还可以添加多个查询和每个查询,也会生成不同的 REST 端点。例如,为 find-approved 生成 FindApproved REST 端点。

第 20 章 其他资源

附录 A. 版本控制信息

文档最新更新于 2023 年 2 月 1 日(周三)。

附录 B. 联系信息

Red Hat Decision Manager 文档团队: brms-docs@redhat.com

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部