第 57 章 执行规则


在 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>

    默认情况下,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>

    如需这些工件的可用版本,请在线搜索 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>

    有关 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>
  6. 如果您在用于调试日志的客户端应用程序 pom.xml 文件中添加 slf4j 依赖项,请在相关 classpath 上 创建一个简单的logger.properties 文件(例如,在 Maven 中的 src/main/resources/META-INF 中),其中包含以下内容:

    org.slf4j.simpleLogger.defaultLogLevel=debug
  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

    要在 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();
        }
      }
    }

    要在 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();
        }
      }
    }

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

    Maven 执行示例(带有项目目录):

    mvn clean install exec:java -Dexec.mainClass="com.sample.app.RulesTest"

    Java 执行示例(使用项目目录)

    javac -classpath "./$DEPENDENCIES/*:." RulesTest.java
    java -classpath "./$DEPENDENCIES/*:." RulesTest
  9. 在命令行和服务器日志中查看规则执行状态。如果有任何规则没有如预期执行,请查看项目中配置的规则和主类配置以验证所提供的数据。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部