18.3. 使用 Maven 创建并执行 DRL 规则


您可以使用 Maven 架构类型创建带有规则的 DRL 文件,并将 archetypes 与 Red Hat Process Automation Manager 决策服务集成。如果您已将外部 Maven archetypes 用于决策服务并希望继续相同的工作流,则创建 DRL 规则的方法非常有用。如果您还没有使用这个方法,则建议创建 DRL 文件和其他规则资产,建议使用 Red Hat Process Automation Manager 的 Business Central 接口。

�程

  1. 进入您要创建 Maven 架构类型的目录,并运行以下命令:

    mvn archetype:generate -DgroupId=com.sample.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    这会创建一个具有以下结构的目录 my-app

    my-app
    |-- pom.xml
    `-- src
        |-- main
        |   `-- java
        |       `-- com
        |           `-- sample
        |               `-- app
        |                   `-- App.java
        `-- test
            `-- java
                `-- com
                    `-- sample
                        `-- app
                            `-- AppTest.java

    my-app 目录包含以下关键组件:

    • 用于存储应用程序源的 src/main 目录
    • 用于存储测试源的 src/test 目录
    • 带有项目配置的 pom.xml 文件
  2. 创建一个 Java 对象,该规则或规则将在 Maven archetype 中操作。

    在本例中,在 my-app/src/main/java/com/sample/app 目录中创建一个 Person.java 文件。Person 类包含 getter 和 setter 方法,用于设置和检索名字、姓氏、每小时率以及人的 wage:

    package com.sample.app;
    
      public class Person {
    
        private String firstName;
        private String lastName;
        private Integer hourlyRate;
        private Integer wage;
    
        public String getFirstName() {
          return firstName;
        }
    
        public void setFirstName(String firstName) {
          this.firstName = firstName;
        }
    
        public String getLastName() {
          return lastName;
        }
    
        public void setLastName(String lastName) {
          this.lastName = lastName;
        }
    
        public Integer getHourlyRate() {
          return hourlyRate;
        }
    
        public void setHourlyRate(Integer hourlyRate) {
          this.hourlyRate = hourlyRate;
        }
    
        public Integer getWage(){
          return wage;
        }
    
        public void setWage(Integer wage){
          this.wage = wage;
        }
      }
  3. my-app/src/main/resources/rules 格式创建一个规则文件。 DRL 文件必须至少包含软件包规格、规则或规则要使用的数据对象导入列表,以及一个或多个带有 when 条件的规则。

    以下 Wage.drl 文件包含 Wage 规则,用于导入 Person 类,计算 wage 和每小时速率值,并根据结果显示一个信息:

    package com.sample.app;
    
    import com.sample.app.Person;
    
    dialect "java"
    
    rule "Wage"
      when
        Person(hourlyRate * wage > 100)
        Person(name : firstName, surname : lastName)
      then
        System.out.println("Hello " + name + " " + surname + "!");
        System.out.println("You are rich!");
    end
  4. my-app/src/main/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 基础中包含 特定软件包 中的 DRL 文件。您还可以从每个 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">
      <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 会话是从 KBase1 KIE 基础实例化的,来自 KBase2 的 KIE 会话。KBase2 中的 KIE 会话是一个 无状态 KIE 会话,这意味着之前调用 KIE 会话(之前会话状态)的数据在会话调用之间被丢弃。KIE 基础中包含特定规则资产 软件包。当以这种方式指定软件包时,您必须将 DRL 文件组织为反映指定软件包的文件夹结构。

  5. my-app/pom.xml 配置文件中,指定应用程序所需的库。提供 Red Hat Process Automation Manager 依赖项以及应用程序 的组ID、工件 ID 和版本 (GAV)。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0.0</version>
    <repositories>
      <repository>
        <id>jboss-ga-repository</id>
        <url>http://maven.repository.redhat.com/ga/</url>
      </repository>
    </repositories>
    <dependencies>
      <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>VERSION</version>
      </dependency>
      <dependency>
        <groupId>org.kie</groupId>
        <artifactId>kie-api</artifactId>
        <version>VERSION</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
    </project>

    有关 Red Hat Process Automation Manager 中的 Maven 依赖项和 BOM (Bill of Materials)的信息,请参阅 Red Hat Process Automation Manager 和 Maven 库版本之间的映射是什么?

  6. 使用 my-app/src/test/java/com/sample/app/AppTest.java 中的 testApp 方法来测试规则。默认情况下,AppTest.java 文件由 Maven 创建。
  7. AppTest.java 文件中,添加所需的 导入 语句来导入 KIE 服务、KIE 容器和 KIE 会话。然后,加载 KIE 基础、插入事实,并从 testApp () 方法执行规则,该方法将事实模型传递给规则。

    import org.kie.api.KieServices;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    
    public void testApp() {
    
      // Load the KIE base:
      KieServices ks = KieServices.Factory.get();
      KieContainer kContainer = ks.getKieClasspathContainer();
      KieSession kSession = kContainer.newKieSession();
    
      // Set up the fact model:
      Person p = new Person();
      p.setWage(12);
      p.setFirstName("Tom");
      p.setLastName("Summers");
      p.setHourlyRate(10);
    
      // Insert the person into the session:
      kSession.insert(p);
    
      // Fire all rules:
      kSession.fireAllRules();
      kSession.dispose();
    }
  8. 在 Maven archetype 中创建并保存所有 DRL 资产后,在命令行中进入 my-app 目录,并运行以下命令来构建您的文件:

    mvn clean install

    如果构建失败,请解决命令行错误消息中描述的任何问题,并尝试验证文件,直到构建成功为止。

  9. 文件构建成功后,运行以下命令在本地执行规则。将 com.sample.app 替换为您的软件包名称。

    mvn exec:java -Dexec.mainClass="com.sample.app"
  10. 检查规则以确保它们正确执行,并解决文件中所需的更改。

要将新规则资产与 Red Hat Process Automation Manager 中的现有项目集成,您可以将新的 Maven 项目编译为 知识 JAR (KJAR),并将它作为依赖项添加到 Business Central 中项目的 pom.xml 文件中。要访问 Business Central 中的项目 pom.xml 文件,您可以在屏幕左侧的 Project Explorer 菜单中选择任何现有资产,然后点击 Customize View gear 图标并选择 Repository View pom.xml

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部