第 20 章 其他创建和执行 DRL 规则的方法


作为在 Business Central 界面中创建和管理 DRL 规则的替代方法,您可以使用 Red Hat CodeReady Studio 或者另一个集成的开发环境(IDE)在外部创建 DRL 规则文件作为 Maven 或 Java 项目的一部分。然后可将这些独立项目作为知识 JAR(KJAR)依赖关系集成到 Business Central 的现有红帽决策管理器项目中。独立项目中的 DRL 文件必须至少包含必要的软件包规格、导入 列表 和规则 定义。其他 DRL 组件(如全局变量和功能)都是可选的。与 DRL 规则相关的所有数据对象必须包含在独立 DRL 项目或部署中。

您还可以在 Maven 或 Java 项目中使用可执行规则模型,以提供构建时要执行的规则集的基于 Java 的表示。可执行模型是 Red Hat Decision Manager 中标准资产打包的更高效的替代方案,使 KIE 容器和 KIE 基础能够更快创建,特别是在您拥有大量 DRL(Drools 规则语言)文件和其他红帽决策管理器资产列表。

20.1. 使用 Java 创建并执行 DRL 规则

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

流程

  1. 创建运行规则或规则的 Java 对象。

    在本例中,Person.java 文件是在 my-project 目录中创建的。Person 类包含 getter 和 setter 方法,用于设置和检索第一个名称、姓氏、每小时速率和个人的 wage:

      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;
        }
      }
    Copy to Clipboard Toggle word wrap
  2. my-project 目录下,以 .drl 格式创建一个规则文件。DRL 文件必须至少包含软件包规格(如果适用),由规则或规则使用的数据对象导入列表,以及条件和动作时使用的一个或多个规则。

    以下 Wage.drl 文件包含一个 Wage 规则,它计算 wage 和 hourly 速率值,并显示基于结果的消息:

    package com.sample;
    
    import com.sample.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
    Copy to Clipboard Toggle word wrap
  3. 创建主类,并将它保存到与您创建的 Java 对象相同的目录中。主类将加载 KIE 基础并执行规则。
  4. 在主类中,添加所需的 导入 语句来导入 KIE 服务、KIE 容器和 KIE 会话。然后,载入 KIE 基础、插入事实,并从将事实模型传递给规则的 main() 方法执行规则。

    在本例中,my-project 中创建了一个 RulesTest.java 文件,其中包含所需的导入和 main() 方法:

    import org.kie.api.KieServices;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    
    public class RulesTest {
      public static final void main(String[] args) {
        try {
          // 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();
        }
    
        catch (Throwable t) {
          t.printStackTrace();
        }
      }
    }
    Copy to Clipboard Toggle word wrap
  5. 从红帽客户门户下载 Red Hat Process Automation Manager 7.13.2 Source Distribution ZIP 文件,并将它提取到 my-project/dm-engine-jars/ 下。
  6. my-project/META-INF 目录中,创建包含以下内容的 kmodule.xml 元数据文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns="http://www.drools.org/xsd/kmodule">
    </kmodule>
    Copy to Clipboard Toggle word wrap

    这个 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>
    Copy to Clipboard Toggle word wrap

    这个示例定义了两个 KIE 基础。两个 KIE 会话是由 KBase1 KIE 基础实例化,以及来自 KBase2 的 KIE 会话。KBase2 中的 KIE 会话是一个 无状态 KIE 会话,这意味着之前调用 KIE 会话(之前会话状态)中的数据会在会话调用之间丢弃。规则 资产的软件包包括在 KIE 基础中。当您以这种方式指定软件包时,您必须将 DRL 文件组织到反映指定软件包的文件夹结构中。

  7. 在您的 Java 对象中创建并保存所有 DRL 资产后,导航到命令行中的 my-project 目录,再运行以下命令来构建 Java 文件。将 RulesTest.java 替换为您的 Java 主类的名称。

    javac -classpath "./dm-engine-jars/*:." RulesTest.java
    Copy to Clipboard Toggle word wrap

    如果构建失败,请解决命令行错误消息中描述的任何问题,并尝试验证 Java 对象,直到对象通过为止。

  8. 在您的 Java 文件构建成功后,运行以下命令在本地执行规则。将 RulesTest 替换为您的 Java 主类前缀。

    java -classpath "./dm-engine-jars/*:." RulesTest
    Copy to Clipboard Toggle word wrap
  9. 检查规则,以确保它们正确执行,并解决 Java 文件中需要的任何更改。

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat