第 44 章 执行规则


在 Business Central 中识别示例规则或创建自己的规则后,您可以构建和部署关联的项目,并在 KIE 服务器上执行规则来测试规则。

先决�件

流程

  1. 在 Business Central 中,进入 Menu Design Projects,然后点击项目名称。
  2. 在项目 资产 页面右上角,点 Deploy 以构建项目并将其部署到 KIE Server。如果构建失败,请解决屏幕底部的 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 :(可选)使客户端应用程序能够使用简单日志记录 Facade for Java (SLF4J)在与 KIE 服务器交互后返回调试日志信息

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

    <!-- For local execution -->
    <dependency>
      <groupId>org.kie</groupId>
      <artifactId>kie-ci</artifactId>
      <version>7.44.0.Final-redhat-00006</version>
    </dependency>
    
    <!-- For remote execution on KIE Server -->
    <dependency>
      <groupId>org.kie.server</groupId>
      <artifactId>kie-server-client</artifactId>
      <version>7.44.0.Final-redhat-00006</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 Manager (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.9.1.redhat-00003</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
    Copy to Clipboard Toggle word wrap

    有关 Red Hat Business 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. 如果您在用于调试日志的客户端应用程序 pom.xml 文件中添加 slf4j 依赖项,请在相关 classpath 上 创建一个简单的logger.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 规则计算 wage 和每小时速率值,并根据结果显示一条消息:

    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