第 47 章 执行规则


在确定了示例规则或在 Business Central 中创建自己的规则后,您可以在本地或 KIE 服务器上构建并部署相关的项目并在 KIE 服务器上执行规则,以测试规则。

先决条件

流程

  1. 在 Business Central 中,前往 Menu Design Projects 并点项目名称。
  2. 在项目 资产 页面右上角,单击 Deploy 以构建该项目,并将它部署到 KIE 服务器。如果构建失败,请解决屏幕底部的 Alerts 面板中描述的问题。

    有关项目部署选项的更多信息,请参阅 打包和部署 Red Hat Process Automation Manager 项目

    注意

    如果项目中规则资产没有从可执行规则模型构建,请验证以下依赖项是否在项目的 pom.xml 文件中构建,并重新构建项目:

    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-model-compiler</artifactId>
      <version>${rhpam.version}</version>
    </dependency>
    Copy to Clipboard Toggle word wrap

    默认情况下,Red Hat Process Automation Manager 中的规则资产需要这个依赖项,从可执行规则模型构建。这个依赖关系包含在 Red Hat Process Automation Manager 核心打包中,但取决于 Red Hat Process Automation Manager 升级历史记录,您可能需要手动添加这个依赖关系来启用可执行规则模型行为。

    有关可执行规则模型的更多信息,请参阅 打包和部署 Red Hat Process Automation Manager 项目

  3. 在 Business Central 之外创建 Maven 或 Java 项目(如果尚未创建),您可将其用于在本地执行规则,或用作在 KIE 服务器上执行规则的客户端应用程序。该项目必须包含 pom.xml 文件以及执行项目资源的任何其他必要组件。

    有关 test 项目示例,请参阅 "创建和执行 DRL 规则的方法 "。

  4. 打开 test 项目或客户端应用程序的 pom.xml 文件,并添加以下依赖项(如果还没有添加):

    • kie-ci :启用客户端应用程序以使用 ReleaseId在本地加载 Business Central 项目数据
    • kie-server-client :使您的客户端应用程序能够与 KIE 服务器上的资产远程交互
    • slf4j:(可选)使您的客户端应用程序能够使用 Simple Logging Facade 用于 Java(SLF4J),以在与 KIE 服务器交互后返回调试信息

    客户端应用程序 pom.xml 文件中的 Red Hat Process Automation Manager 7.13 的依赖项示例:

    <!-- For local execution -->
    <dependency>
      <groupId>org.kie</groupId>
      <artifactId>kie-ci</artifactId>
      <version>7.67.0.Final-redhat-00024</version>
    </dependency>
    
    <!-- For remote execution on KIE Server -->
    <dependency>
      <groupId>org.kie.server</groupId>
      <artifactId>kie-server-client</artifactId>
      <version>7.67.0.Final-redhat-00024</version>
    </dependency>
    
    <!-- For debug logging (optional) -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.7.25</version>
    </dependency>
    Copy to Clipboard Toggle word wrap

    对于这些工件的可用版本,请在 Nexus Repository Manager 在线搜索组 ID 和工件 ID。

    注意

    考虑将 Red Hat Business Automation 材料清单(BOM)依赖项添加到项目 pom.xml 文件,而不是为每个依赖项指定 Red Hat Process Automation Manager < version >。Red Hat Business Automation BOM 适用于 Red Hat Decision Manager 和 Red Hat Process Automation Manager。添加 BOM 文件时,项目中包含来自提供的 Maven 存储库的正确依赖项版本。

    BOM 依赖项示例:

    <dependency>
      <groupId>com.redhat.ba</groupId>
      <artifactId>ba-platform-bom</artifactId>
      <version>7.13.5.redhat-00002</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
    Copy to Clipboard Toggle word wrap

    有关 Red Hat Automation BOM 的更多信息,请参阅 Red Hat Process Automation Manager 和 Maven 库版本之间的映射是什么?

  5. 确保在客户端应用 pom.xml 文件中定义了包含模型类的工件依赖项,它们与部署的项目的 pom.xml 文件中完全相同。如果模型类的依赖关系因客户端应用和项目之间有所不同,则可能会出现执行错误。

    要访问 Business Central 中的项目 pom.xml 文件,请在项目左侧选择任何现有资产,然后在屏幕左侧的 Project Explorer 菜单中,单击 Customize View gear 图标并选择 Repository View pom.xml

    例如,以下 Person 类依赖项同时出现在客户端和部署的项目 pom.xml 文件中:

    <dependency>
      <groupId>com.sample</groupId>
      <artifactId>Person</artifactId>
      <version>1.0.0</version>
    </dependency>
    Copy to Clipboard Toggle word wrap
  6. 如果您将 slf4j 依赖项添加到用于调试日志的客户端应用程序 pom.xml 文件,请在相关类路径(例如,在 Maven 中的 src/main/resources/META-INF)上创建一个 simplelogger.properties 文件(例如,在 Maven 中的 src/main/resources/META-INF ):

    org.slf4j.simpleLogger.defaultLogLevel=debug
    Copy to Clipboard Toggle word wrap
  7. 在您的客户端应用中,创建一个包含必要导入和 main() 方法的 .java 主类,以加载 KIE 基础、插入事实和执行规则。

    例如,项目中的 Person 对象包含 getter 和 setter 方法,用于设置并检索一个人的名字、姓氏、每小时速率和分流。项目中的以下 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

    要在 KIE 服务器之外测试此规则(如果需要),请配置 .java 类以导入 KIE 服务、KIE 容器和 KIE 会话,然后使用 main() 方法针对定义的事实模型触发所有规则:

    本地执行规则

    import org.kie.api.KieServices;
    import org.kie.api.builder.ReleaseId;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    import org.drools.compiler.kproject.ReleaseIdImpl;
    
    public class RulesTest {
    
      public static final void main(String[] args) {
        try {
          // Identify the project in the local repository:
          ReleaseId rid = new ReleaseIdImpl("com.myspace", "MyProject", "1.0.0");
    
          // Load the KIE base:
          KieServices ks = KieServices.Factory.get();
          KieContainer kContainer = ks.newKieContainer(rid);
          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

    要在 KIE 服务器上测试此规则,请配置 .java 类,其导入和规则执行信息与本地示例类似,另外还指定 KIE 服务配置和 KIE 服务客户端详情:

    在 KIE 服务器上执行规则

    package com.sample;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    import org.kie.api.command.BatchExecutionCommand;
    import org.kie.api.command.Command;
    import org.kie.api.KieServices;
    import org.kie.api.runtime.ExecutionResults;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    import org.kie.server.api.marshalling.MarshallingFormat;
    import org.kie.server.api.model.ServiceResponse;
    import org.kie.server.client.KieServicesClient;
    import org.kie.server.client.KieServicesConfiguration;
    import org.kie.server.client.KieServicesFactory;
    import org.kie.server.client.RuleServicesClient;
    
    import com.sample.Person;
    
    public class RulesTest {
    
      private static final String containerName = "testProject";
      private static final String sessionName = "myStatelessSession";
    
      public static final void main(String[] args) {
        try {
          // Define KIE services configuration and client:
          Set<Class<?>> allClasses = new HashSet<Class<?>>();
          allClasses.add(Person.class);
          String serverUrl = "http://$HOST:$PORT/kie-server/services/rest/server";
          String username = "$USERNAME";
          String password = "$PASSWORD";
          KieServicesConfiguration config =
            KieServicesFactory.newRestConfiguration(serverUrl,
                                                    username,
                                                    password);
          config.setMarshallingFormat(MarshallingFormat.JAXB);
          config.addExtraClasses(allClasses);
          KieServicesClient kieServicesClient =
            KieServicesFactory.newKieServicesClient(config);
    
          // Set up the fact model:
          Person p = new Person();
          p.setWage(12);
          p.setFirstName("Tom");
          p.setLastName("Summers");
          p.setHourlyRate(10);
    
          // Insert Person into the session:
          KieCommands kieCommands = KieServices.Factory.get().getCommands();
          List<Command> commandList = new ArrayList<Command>();
          commandList.add(kieCommands.newInsert(p, "personReturnId"));
    
          // Fire all rules:
          commandList.add(kieCommands.newFireAllRules("numberOfFiredRules"));
          BatchExecutionCommand batch = kieCommands.newBatchExecution(commandList, sessionName);
    
          // Use rule services client to send request:
          RuleServicesClient ruleClient = kieServicesClient.getServicesClient(RuleServicesClient.class);
          ServiceResponse<ExecutionResults> executeResponse = ruleClient.executeCommandsWithResults(containerName, batch);
          System.out.println("number of fired rules:" + executeResponse.getResult().getValue("numberOfFiredRules"));
        }
    
        catch (Throwable t) {
          t.printStackTrace();
        }
      }
    }
    Copy to Clipboard Toggle word wrap

  8. 从项目目录中运行配置的 .java 类。您可以在开发平台(如 Red Hat CodeReady Studio)或命令行中运行该文件。

    Maven 执行示例(在项目目录中):

    mvn clean install exec:java -Dexec.mainClass="com.sample.app.RulesTest"
    Copy to Clipboard Toggle word wrap

    Java 执行示例(在项目目录中)

    javac -classpath "./$DEPENDENCIES/*:." RulesTest.java
    java -classpath "./$DEPENDENCIES/*:." RulesTest
    Copy to Clipboard Toggle word wrap
  9. 在命令行中检查规则执行状态并在服务器日志中。如果有任何规则没有按预期执行,请检查项目中配置的规则,以及验证提供的数据的主类配置。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat