第 3 章 没有 Business Central 的项目部署

作为在 Business Central 界面中开发和部署项目的替代选择,您可以使用独立的 Maven 项目或您自己的 Java 应用程序来开发 Red Hat Process Automation Manager 项目,并将它们部署在 KIE 容器(部署单元)中。然后,您可以使用 KIE Server REST API 启动、停止或删除包含您构建和部署的服务及其项目版本的 KIE 容器。通过这种灵活性,您可以继续使用现有的应用程序工作流来使用 Red Hat Process Automation Manager 功能开发业务资产。

当您构建和部署项目时,Business Central 中的项目会自动打包。对于 Business Central 之外的项目,如 Java 应用程序中的独立的 Maven 项目或项目,您必须在附加的 kmodule.xml 文件中配置 KIE 模块描述符设置,或直接在 Java 应用程序中配置部署项目。

3.1. 配置 KIE 模块描述符文件

KIE 模块是带有额外元数据文件 META-INF/kmodule.xml 的 Maven 项目或模块。所有 Red Hat Process Automation Manager 项目都需要一个 kmodule.xml 文件才能正确打包和部署。此 kmodule.xml 文件是一个 KIE 模块描述符,它为项目中的资产定义 KIE 基础和 KIE 会话配置。KIE 基础是一个存储库,其中包含 Red Hat Process Automation Manager 中的所有规则、进程和其他业务资产,但不包含任何运行时数据。KIE 会话存储并执行运行时数据,如果已在 kmodule.xml 文件中定义 KIE 会话,则从 KIE 基础或直接从 KIE 容器创建。

如果您在 Business Central 外部创建项目,如 Java 应用程序中的独立 Maven 项目或项目,您必须在附加的 kmodule.xml 文件中配置 KIE 模块描述符设置,或者直接在 Java 应用程序中构建和部署项目。

流程

  1. 在项目的 ~/resources/META-INF 目录中,创建一个包含以下内容的 kmodule.xml 元数据文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns="http://www.drools.org/xsd/kmodule">
    </kmodule>

    这个空的 kmodule.xml 文件足以生成一个默认 KIE 基础,其中包含 项目资源 路径下找到的所有文件。默认 KIE 基础还包括一个默认 KIE 会话,该会话会在构建时在应用程序中创建 KIE 容器时触发。

    以下示例是更高级的 kmodule.xml 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.drools.org/xsd/kmodule">
      <configuration>
          <property key="drools.evaluator.supersetOf" value="org.mycompany.SupersetOfEvaluatorDefinition"/>
      </configuration>
      <kbase name="KBase1" default="true" eventProcessingMode="cloud" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg1">
        <ksession name="KSession1_1" type="stateful" default="true" />
        <ksession name="KSession1_2" type="stateful" default="true" beliefSystem="jtms" />
      </kbase>
      <kbase name="KBase2" default="false" eventProcessingMode="stream" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1">
        <ksession name="KSession2_1" type="stateless" default="true" clockType="realtime">
          <fileLogger file="debugInfo" threaded="true" interval="10" />
          <workItemHandlers>
            <workItemHandler name="name" type="new org.domain.WorkItemHandler()" />
          </workItemHandlers>
          <listeners>
            <ruleRuntimeEventListener type="org.domain.RuleRuntimeListener" />
            <agendaEventListener type="org.domain.FirstAgendaListener" />
            <agendaEventListener type="org.domain.SecondAgendaListener" />
            <processEventListener type="org.domain.ProcessListener" />
          </listeners>
        </ksession>
      </kbase>
    </kmodule>

    这个示例定义了两个 KIE 基础。KIE 基础中包含特定规则资产 软件包。以这种方式指定软件包时,您必须使用反映指定软件包的文件夹结构来组织您的规则文件。两个 KIE 会话是从 KBase1 KIE 基础实例化的,来自 KBase2 的 KIE 会话。KBase2 中的 KIE 会话是一个 无状态 KIE 会话,这意味着之前调用 KIE 会话(之前会话状态)的数据在会话调用之间被丢弃。KIE 会话还指定文件(或控制台)日志记录器、WorkItemHandler 以及显示的三种类型的监听程序: ruleRuntimeEventListener、MuterEventListenerprocessEventListener。& lt;configuration > 元素定义了可用于进一步自定义 kmodule.xml 文件的可选属性。

    作为手动将 kmodule.xml 文件手动附加到项目的替代选择,您可以使用 Java 应用程序中的 KieModuleModel 实例以编程方式创建一个 kmodule.xml 文件来定义 KIE 基础和 KIE 会话,然后将项目中的所有资源添加到 KIE 虚拟文件系统 KieFileSystem

    以编程方式创建 kmodule.xml,并将其添加到 KieFileSystem

    import org.kie.api.KieServices;
    import org.kie.api.builder.model.KieModuleModel;
    import org.kie.api.builder.model.KieBaseModel;
    import org.kie.api.builder.model.KieSessionModel;
    import org.kie.api.builder.KieFileSystem;
    
    KieServices kieServices = KieServices.Factory.get();
    KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
    
    KieBaseModel kieBaseModel1 = kieModuleModel.newKieBaseModel("KBase1")
      .setDefault(true)
      .setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
      .setEventProcessingMode(EventProcessingOption.STREAM);
    
    KieSessionModel ksessionModel1 = kieBaseModel1.newKieSessionModel("KSession1_1")
      .setDefault(true)
      .setType(KieSessionModel.KieSessionType.STATEFUL)
      .setClockType(ClockTypeOption.get("realtime"));
    
    KieFileSystem kfs = kieServices.newKieFileSystem();
    kfs.writeKModuleXML(kieModuleModel.toXML());

  2. 在项目中手动配置 kmodule.xml 文件后,以编程方式从 KIE 容器检索 KIE 基础和 KIE 会话以验证配置:

    KieServices kieServices = KieServices.Factory.get();
    KieContainer kContainer = kieServices.getKieClasspathContainer();
    
    KieBase kBase1 = kContainer.getKieBase("KBase1");
    KieSession kieSession1 = kContainer.newKieSession("KSession1_1"),
        kieSession2 = kContainer.newKieSession("KSession1_2");
    
    KieBase kBase2 = kContainer.getKieBase("KBase2");
    StatelessKieSession kieSession3 = kContainer.newStatelessKieSession("KSession2_1");

    如果 kmodule.xml 文件中的 KieBaseKieSession 配置为 default="true",如前面的 kmodule.xml 示例中所示,您可以在不传递任何名称的情况下从 KIE 容器检索它们:

    KieContainer kContainer = ...
    
    KieBase kBase1 = kContainer.getKieBase();
    KieSession kieSession1 = kContainer.newKieSession(),
        kieSession2 = kContainer.newKieSession();
    
    KieBase kBase2 = kContainer.getKieBase();
    StatelessKieSession kieSession3 = kContainer.newStatelessKieSession();

    要增加或减少决策引擎中缓存的 KIE 模块或工件版本的最大数量,您可以在 Red Hat Process Automation Manager 发行版本中修改以下系统属性值:

    • kie.repository.project.cache.size :在决策引擎中缓存的最大 KIE 模块数。默认值 :100
    • kie.repository.project.versions.cache.size: 在决策引擎中缓存的同一工件的最大版本数。默认值 :10

    如需 KIE 存储库配置的完整列表,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.11.0 Source Distribution ZIP 文件,并进入 ~/rhpam-7.11.0-sources/src/drools-$VERSION/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieRepositoryImpl.javahttps://access.redhat.com/jbossnetwork/restricted/listSoftware.html

有关 kmodule.xml 文件的更多信息,请从 红帽客户门户网站 (如果还没有下载)下载 Red Hat Process Automation Manager 7.11.0 Source Distribution ZIP 文件(如果还没有下载)并查看 $FILE_HOME/rhpam-$VERSION-sources/kie-api-parent-$VERSION/kie-api/src/main/resources/org/kie/api/.

3.1.1. KIE 模块配置属性

您的项目的 KIE 模块描述符文件 (kmodule.xml) 中提供了可选的 <configuration> 项用于定义属性 keyvalue 对,可以进一步自定义您的 kmodule.xml 文件。

kmodule.xml 文件中的配置属性示例

<kmodule>
  ...
  <configuration>
    <property key="drools.dialect.default" value="java"/>
    ...
  </configuration>
  ...
</kmodule>

以下是项目的 KIE 模块描述符文件(kmodule.xml)中支持的 < configuration > 属性键和值:

drools.dialect.default

设置默认 Drools dialect。

支持的值有 java,mvel

<property key="drools.dialect.default"
  value="java"/>
drools.accumulate.function.$FUNCTION

将实施累积功能的类链接到指定功能名称,该名称允许您在决策引擎中添加自定义累积功能。

<property key="drools.accumulate.function.hyperMax"
  value="org.drools.custom.HyperMaxAccumulate"/>
drools.evaluator.$EVALUATION

将实施 evaluator 定义的类链接到指定的 evaluator 名称,以便您可以将自定义评估器添加到决策引擎中。evaluator 与自定义操作器类似。

<property key="drools.evaluator.soundslike"
  value="org.drools.core.base.evaluators.SoundslikeEvaluatorsDefinition"/>
drools.dump.dir

设置 Red Hat Process Automation Manager dump/log 目录的路径。

<property key="drools.dump.dir"
  value="$DIR_PATH/dump/log"/>
drools.defaultPackageName

为您的项目中的业务资产设置默认软件包。

<property key="drools.defaultPackageName"
  value="org.domain.pkg1"/>
drools.parser.processStringEscapes

设置 String 转义功能。如果此属性设为 false,则 \n 字符将不会解释为换行符。

支持的值: true (默认)、false

<property key="drools.parser.processStringEscapes"
  value="true"/>
drools.kbuilder.severity.$DUPLICATE

为构建 KIE 基础时报告重复规则、进程或功能的实例设置严重性。例如,如果您将 duplicateRule 设置为 ERROR,则会在构建 KIE 基础时为检测到的任何重复规则生成一个错误。

支持的密钥后缀: duplicateRule,duplicateProcess,duplicateFunction

支持的值有 INFOWARNINGERROR

<property key="drools.kbuilder.severity.duplicateRule"
  value="ERROR"/>
drools.propertySpecific

设置决策引擎的属性重新活动。

支持的值: DISABLEDALLOWEDALWAYS

<property key="drools.propertySpecific"
  value="ALLOWED"/>
drools.lang.level

设置 DRL 语言级别。

支持的值: DRL5,DRL6,DRL6_STRICT (默认)

<property key="drools.lang.level"
  value="DRL_STRICT"/>

3.1.2. KIE 模块中支持的 KIE 基本属性

KIE 基础是您在 KIE 模块描述符文件(kmodule.xml)中定义的存储库,其中包含 Red Hat Process Automation Manager 中的所有规则、流程和其他业务资产。当您在 kmodule.xml 文件中定义 KIE 基础时,您可以指定某些属性和值来进一步自定义 KIE 基础配置。

kmodule.xml 文件中的 KIE 基础配置示例

<kmodule>
  ...
  <kbase name="KBase2" default="false" eventProcessingMode="stream" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1" sequential="false">
    ...
  </kbase>
  ...
</kmodule>

以下是项目的 KIE 模块描述符文件(kmodule.xml)支持的 kbase 属性和值:

表 3.1. KIE 模块中支持的 KIE 基本属性

属性支持的值描述

name

任何名称

定义从 KieContainer 检索 KieBase 的名称。此属性是强制的

includes

KIE 模块中其他 KIE 基本对象的逗号分隔列表

定义此 KIE 基础中包含的其他 KIE 基础对象和工件。如果您在模块的 pom.xml 文件中声明为依赖项,则 KIE 基础可以包含在多个 KIE 模块中。

软件包

KIE 基础中包含的软件包列表以逗号分隔的软件包列表

默认: all

定义包括在此 KIE 基础中的工件(如规则和流程)的软件包。默认情况下,~/resources 目录中的所有工件都包含在 KIE 基础中。此属性允许您限制编译的工件数量。只有属于此属性中指定的列表的软件包才会被编译。

default

truefalse

默认:false

确定 KIE 基础是否为模块的默认 KIE 基础,以便它可以从 KIE 容器创建,而无需传递任何名称。每个模块只能有一个默认 KIE 基础。

equalsBehavior

身份相等

默认 : identity

定义在新事实插入工作内存中时 Red Hat Process Automation Manager 的行为。如果设置为 identity,则始终创建新的 factHandle,除非工作内存中已存在同一对象。如果设置为等 相等,则只有在新插入的对象不等于现有事实时,才会创建一个新的 fact Handle,具体取决于插入的事实的等等方法。当您希望根据功能 相等 而不是显式身份评估对象时,请使用相等模式。

eventProcessingMode

Cloud,stream

默认: cloud

决定如何在 KIE 基础中处理事件。如果此属性设置为 cloud,则 KIE 基础会将事件视为正常事实。如果将此属性设置为 ,则允许对事件进行临时的原因。

declarativeAgenda

禁用启用

Default: disabled

决定是否启用声明性议程。

sequential

truefalse

默认:false

决定是否启用后续模式。在后续模式中,决策引擎会按照决策引擎人员中列出的顺序来一次评估规则,而无需考虑工作内存中的更改。如果您使用无状态 KIE 会话,并且您不希望执行规则来影响办公室中的后续规则,请启用此属性。

3.1.3. KIE 模块支持的 KIE 会话属性

KIE 会话存储并执行运行时数据,如果您为项目定义了 KIE 模块描述符文件(kmodule.xml)中的 KIE 会话,则从 KIE 容器创建或直接从 KIE 容器创建。当您在 kmodule.xml 文件中定义 KIE 基础和 KIE 会话时,您可以指定某些属性和值来进一步自定义 KIE 会话配置。

kmodule.xml 文件中的 KIE 会话配置示例

<kmodule>
  ...
  <kbase>
    ...
    <ksession name="KSession2_1" type="stateless" default="true" clockType="realtime">
    ...
  </kbase>
  ...
</kmodule>

以下是项目的 KIE 模块描述符文件(kmodule.xml)支持的 ksession 属性和值:

表 3.2. KIE 模块支持的 KIE 会话属性

属性支持的值描述

name

任何名称

定义从 KieContainer 检索 KieSession 的名称。此属性是强制的

type

有状态无状态

默认: stateful

决定数据是否保留(有状态)还是在 KIE 会话调用之间丢弃(无状态)。将会话设置为 stateful 可让您使用工作内存进行迭代工作;将会话设置为 stateless 通常用于一次性执行的资产。无状态 会话存储了一个知识状态,在每次添加新事实、更新或删除规则时,以及每次执行规则时改变。在 无状态 会话中执行时没有关于之前操作的信息,如规则执行。

default

truefalse

默认:false

确定 KIE 会话是否为模块的默认会话,以便可以从 KIE 容器创建它,而无需传递任何名称。每个模块只能有一个默认 KIE 会话。

clockType

realtime,pseudo

默认: realtime

决定是否由系统时钟或应用程序控制的伪时钟分配事件时间戳。这个时钟对临时规则的单元测试特别有用。

beliefSystem

Simple,jtms,defeasible

默认: simple

定义 KIE 会话使用的适合系统的类型。因此,系统会降低知识(facts)的真实信息。例如,如果基于另一个事实(以后从决策引擎中删除)插入了新的事实,系统也可以确定新插入的事实也应该被删除。