搜索

第 60 章 执行规则

download PDF

在确定了示例规则或在 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>

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

    对于这些工件的可用版本,请在 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>

    有关 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>
  6. 如果您将 slf4j 依赖项添加到用于调试日志的客户端应用程序 pom.xml 文件,请在相关类路径(例如,在 Maven 中的 src/main/resources/META-INF)上创建一个 simplelogger.properties 文件(例如,在 Maven 中的 src/main/resources/META-INF ):

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

    要在 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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

© 2024 Red Hat, Inc.