20.2. 使用 Maven 创建和执行 DRL 规则

您可以使用 Maven archetypes 创建 DRL 文件及规则,并将 archetypes 与 Red Hat Decision Manager 决策服务集成。如果您已将外部 Maven archetypes 用于决策服务,并且希望继续相同的工作流,则创建 DRL 规则的方法很有用。如果您还没有使用这个方法,则建议红帽决策管理器的 Business Central 界面创建 DRL 文件和其他规则资产。

流程

  1. 进入要创建 Maven archetype 并运行以下命令的目录:

    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. 创建规则或规则在 Maven archetype 中操作的 Java 对象。

    在本例中,Person.java 文件是在 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/com/sample/app 格式创建一个规则文件。 DRL 文件必须至少包含软件包规格、规则或规则要使用的数据对象导入列表,以及带有条件和动作的一个或多个规则。

    以下 Wage.drl 文件包含导入 Person 类的 Wage 规则,计算出 wage 和 hourly 速率值,并根据结果显示一条消息:

    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 Decision 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>
    
    <properties>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <dependencies>
      <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>VERSION</version>
      </dependency>
      <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-mvel</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 Decision Manager 中的 Maven 依赖项和 BOM( Materials 的基础)的信息,请参阅 Red Hat Decision 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.App"
  10. 检查规则以确保它们正确执行,并处理文件中所需的所有更改。

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