第 26 章 为 KIE 服务器模板和实例处理自动化管理器控制器 Java 客户端 API

Red Hat Process Automation Manager 提供了一个 Process Automation Manager 控制器 Java 客户端 API,可让您使用 Java 客户端应用程序中的 REST 或 WebSocket 协议连接到 Process Automation Manager 控制器。您可以使用 Process Automation Manager 控制器 Java 客户端 API 作为 Process Automation Manager 控制器 REST API 的替代选择,以与 KIE Server 模板(配置)、KIE 服务器实例(远程服务器)以及 Red Hat Process Automation Manager 中的关联的 KIE 容器(部署单元)进行交互,而无需使用 Business Central 用户界面。通过这个 API 支持,您可以更有效地维护 Red Hat Process Automation Manager 服务器和资源,并使用 Red Hat Process Automation Manager 优化集成和开发。

使用 Process Automation Manager 控制器 Java 客户端 API,您还可以执行以下操作,并被 Process Automation Manager 控制器 REST API 支持:

  • 检索 KIE Server 模板、实例和相关 KIE 容器的信息
  • 更新、启动或停止与 KIE Server 模板和实例关联的 KIE 容器
  • 创建、更新或删除 KIE 服务器模板
  • 创建、更新或删除 KIE 服务器实例

处理 Automation Manager 控制器 Java 客户端 API 请求需要以下组件:

身份验证

Process Automation Manager 控制器 Java 客户端 API 需要以下用户角色的 HTTP 基本身份验证,具体取决于控制器类型:

  • 如果您安装了 Business Central 且希望使用内置 Process Automation Manager 控制器,则 REST -all 用户角色
  • 如果您独立于 Business Central 安装无头 Process Automation Manager 控制器,则 kie-server 用户角色

要查看 Red Hat Process Automation Manager 发行版配置的用户角色,请导航到 ~/$SERVER_HOME/standalone/configuration/application-roles.properties~/application-users.properties

要添加具有 kie-server 角色或 rest-all 角色或(假设已设置了 Keystore)的用户,请导航到 ~/$SERVER_HOME/bin,并使用指定的角色运行以下命令:

$ ./add-user.sh -a --user <USERNAME> --password <PASSWORD> --role kie-server,rest-all

如果没有设置 Keystore,则执行以下命令来创建密钥存储:

$ keytool -importpassword -keystore $SERVER_HOME/standalone/configuration/kie_keystore.jceks -keypass <SECRETKEYPASSWORD> -alias kieserver -storepass <SECRETSTOREPASSWORD> -storetype JCEKS

另外,在 ~/$SERVER_HOME/standalone/configuration/standalone-full.xml 中添加以下属性:

    <property name="kie.keystore.keyStoreURL" value="file:///data/jboss/rhpam780/standalone/configuration/kie_keystore.jceks"/>
    <property name="kie.keystore.keyStorePwd" value="<SECRETSTOREPASSWORD>"/>
    <property name="kie.keystore.key.server.alias" value="kieserver"/>
    <property name="kie.keystore.key.server.pwd" value="<SECRETKEYPASSWORD>"/>
    <property name="kie.keystore.key.ctrl.alias" value="kieserver"/>
    <property name="kie.keystore.key.ctrl.pwd" value="<SECRETKEYPASSWORD>"/>

要配置带有 Process Automation Manager 控制器访问权限的 kie-serverrest-all 用户,请导航到 ~/$SERVER_HOME/standalone/configuration/standalone-full.xml,取消注释 org.kie.server 属性(如果适用),并添加控制器用户登录凭证和控制器位置(如果需要):

<property name="org.kie.server.location" value="http://localhost:8080/kie-server/services/rest/server"/>
<property name="org.kie.server.controller" value="http://localhost:8080/business-central/rest/controller"/>
<property name="org.kie.server.controller.user" value="<USERNAME>"/>
<property name="org.kie.server.id" value="default-kieserver"/>

有关用户角色和 Red Hat Process Automation Manager 安装选项的更多信息,请参阅 规划 Red Hat Process Automation Manager 安装

项目依赖项

Process Automation Manager 控制器 Java 客户端 API 需要以下依赖 Java 项目的相关类路径:

<!-- For remote execution on controller -->
<dependency>
  <groupId>org.kie.server</groupId>
  <artifactId>kie-server-controller-client</artifactId>
  <version>${rhpam.version}</version>
</dependency>

<!-- For REST client -->
<dependency>
  <groupId>org.jboss.resteasy</groupId>
  <artifactId>resteasy-client</artifactId>
  <version>${resteasy.version}</version>
</dependency>

<!-- For WebSocket client -->
<dependency>
  <groupId>io.undertow</groupId>
  <artifactId>undertow-websockets-jsr</artifactId>
  <version>${undertow.version}</version>
</dependency>

<!-- For debug logging (optional) -->
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>${logback.version}</version>
</dependency>

Red Hat Process Automation Manager 依赖项的 <version> 是项目中当前使用的 Red Hat Process Automation Manager 的 Maven 工件版本(如 7.52.0.Final-redhat-00007)。

注意

考虑将 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.11.0.redhat-00005</version>
  <scope>import</scope>
  <type>pom</type>
</dependency>

有关 Red Hat Business Automation BOM 的更多信息,请参阅 RHPAM 产品和 maven 库版本之间的映射是什么?

客户端请求配置

所有带有 Process Automation Manager 控制器 Java 客户端 API 的 Java 客户端请求必须至少定义以下控制器通信组件:

  • 如果安装了 Business Central,则为 rest-all 用户的凭证,如果您安装了无头进程 Automation Manager 控制器,则由 kie-server 用户分开。
  • 为 REST 或 WebSocket 协议处理自动化管理器控制器位置:

    • REST URL 示例: http://localhost:8080/business-central/rest/controller
    • WebSocket URL 示例: ws://localhost:8080/headless-controller/websocket/controller
  • API 请求和响应的 Marshalling 格式(JSON 或 JAXB)
  • KieServerControllerClient 对象,用作使用 Java 客户端 API 启动服务器通信的入口点
  • KieServerControllerClientFactory 定义 REST 或 WebSocket 协议和用户访问
  • Process Automation Manager 控制器客户端服务或使用的服务,如 listServerTemplatesgetServerTemplategetServerInstances

以下是带有以下组件的 REST 和 WebSocket 客户端配置示例:

使用 REST 的客户端配置示例

import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.controller.api.model.spec.ServerTemplateList;
import org.kie.server.controller.client.KieServerControllerClient;
import org.kie.server.controller.client.KieServerControllerClientFactory;

public class ListServerTemplatesExample {

    private static final String URL = "http://localhost:8080/business-central/rest/controller";
    private static final String USER = "baAdmin";
    private static final String PASSWORD = "password@1";

    private static final MarshallingFormat FORMAT = MarshallingFormat.JSON;

    public static void main(String[] args) {
        KieServerControllerClient client = KieServerControllerClientFactory.newRestClient(URL,
                                                                                          USER,
                                                                                          PASSWORD);

        final ServerTemplateList serverTemplateList = client.listServerTemplates();
        System.out.println(String.format("Found %s server template(s) at controller url: %s",
                                         serverTemplateList.getServerTemplates().length,
                                         URL));
    }
}

使用 WebSocket 的客户端配置示例

import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.controller.api.model.spec.ServerTemplateList;
import org.kie.server.controller.client.KieServerControllerClient;
import org.kie.server.controller.client.KieServerControllerClientFactory;

public class ListServerTemplatesExample {

    private static final String URL = "ws://localhost:8080/my-controller/websocket/controller";
    private static final String USER = "baAdmin";
    private static final String PASSWORD = "password@1";

    private static final MarshallingFormat FORMAT = MarshallingFormat.JSON;

    public static void main(String[] args) {
        KieServerControllerClient client = KieServerControllerClientFactory.newWebSocketClient(URL,
                                                                                               USER,
                                                                                               PASSWORD);

        final ServerTemplateList serverTemplateList = client.listServerTemplates();
        System.out.println(String.format("Found %s server template(s) at controller url: %s",
                                         serverTemplateList.getServerTemplates().length,
                                         URL));
    }
}

26.1. 使用 Process Automation Manager 控制器 Java 客户端 API 发送请求

Process Automation Manager 控制器 Java 客户端 API 可让您使用来自 Java 客户端应用程序的 REST 或 WebSocket 协议连接到 Process Automation Manager 控制器。您可以使用 Process Automation Manager 控制器 Java 客户端 API 作为 Process Automation Manager 控制器 REST API 的替代选择,以与 KIE Server 模板(配置)、KIE 服务器实例(远程服务器)以及 Red Hat Process Automation Manager 中的关联的 KIE 容器(部署单元)进行交互,而无需使用 Business Central 用户界面。

先决条件

  • KIE 服务器已安装并运行。
  • Process Automation Manager 控制器或无头 Process Automation Manager 控制器已安装并运行。
  • 如果您安装了 Business Central,或 kie-server 用户角色可以访问与 Business Central 单独安装的无头 Process Automation Manager 控制器,则您具有对 Process Automation Manager 控制器的 rest-all 用户角色访问。
  • 您有一个带有 Red Hat Process Automation Manager 资源的 Java 项目。

流程

  1. 在客户端应用程序中,确保已将以下依赖项添加到 Java 项目的相关类路径中:

    <!-- For remote execution on controller -->
    <dependency>
      <groupId>org.kie.server</groupId>
      <artifactId>kie-server-controller-client</artifactId>
      <version>${rhpam.version}</version>
    </dependency>
    
    <!-- For REST client -->
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>${resteasy.version}</version>
    </dependency>
    
    <!-- For WebSocket client -->
    <dependency>
      <groupId>io.undertow</groupId>
      <artifactId>undertow-websockets-jsr</artifactId>
      <version>${undertow.version}</version>
    </dependency>
    
    <!-- For debug logging (optional) -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>
  2. 从红帽客户门户网站下载 Red Hat Process Automation Manager 7.11.0 Source Distribution,进入 ~/rhpam-7.11.0-sources/src/droolsjbpm-integration-$VERSION/kie-server-parent/kie-server-controller/kie-server-controller/src/main/java/org/kie/server/controller/client 以访问 Process Automation Manager 控制器 Java 客户端。
  3. ~/kie/server/controller/client 文件夹中,标识您要发送的请求的相关 Java 客户端实施,如 RestKieServerControllerClient 实施,以访问 REST 协议中的 KIE 服务器模板和 KIE 容器的客户端服务。
  4. 在客户端应用程序中,为 API 请求创建一个 .java 类。该类必须包含必要的导入、Process Automation Manager 控制器位置和用户凭证、KieServerControllerClient 对象和要执行的客户端方法,如 createServerTemplatecreateContainerRestKieServerControllerClient 实施中创建Container。根据您的用例调整任何配置详情。

    创建并与 KIE Server 模板和 KIE 容器交互

    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.kie.server.api.marshalling.MarshallingFormat;
    import org.kie.server.api.model.KieContainerStatus;
    import org.kie.server.api.model.KieScannerStatus;
    import org.kie.server.api.model.ReleaseId;
    import org.kie.server.controller.api.model.spec.*;
    import org.kie.server.controller.client.KieServerControllerClient;
    import org.kie.server.controller.client.KieServerControllerClientFactory;
    
    public class RestTemplateContainerExample {
    
      private static final String URL = "http://localhost:8080/business-central/rest/controller";
      private static final String USER = "baAdmin";
      private static final String PASSWORD = "password@1";
    
        private static KieServerControllerClient client;
    
        public static void main(String[] args) {
            KieServerControllerClient client = KieServerControllerClientFactory.newRestClient(URL,
                                                                                              USER,
                                                                                              PASSWORD,
                                                                                              MarshallingFormat.JSON);
            // Create server template and KIE container, start and stop KIE container, and delete server template
            ServerTemplate serverTemplate = createServerTemplate();
            ContainerSpec container = createContainer(serverTemplate);
            client.startContainer(container);
            client.stopContainer(container);
            client.deleteServerTemplate(serverTemplate.getId());
        }
    
        // Re-create and configure server template
        protected static ServerTemplate createServerTemplate() {
            ServerTemplate serverTemplate = new ServerTemplate();
            serverTemplate.setId("example-client-id");
            serverTemplate.setName("example-client-name");
            serverTemplate.setCapabilities(Arrays.asList(Capability.PROCESS.name(),
                                                         Capability.RULE.name(),
                                                         Capability.PLANNING.name()));
    
            client.saveServerTemplate(serverTemplate);
    
            return serverTemplate;
        }
    
        // Re-create and configure KIE containers
        protected static ContainerSpec createContainer(ServerTemplate serverTemplate){
            Map<Capability, ContainerConfig> containerConfigMap = new HashMap();
    
            ProcessConfig processConfig = new ProcessConfig("PER_PROCESS_INSTANCE", "kieBase", "kieSession", "MERGE_COLLECTION");
            containerConfigMap.put(Capability.PROCESS, processConfig);
    
            RuleConfig ruleConfig = new RuleConfig(500l, KieScannerStatus.SCANNING);
            containerConfigMap.put(Capability.RULE, ruleConfig);
    
            ReleaseId releaseId = new ReleaseId("org.kie.server.testing", "stateless-session-kjar", "1.0.0-SNAPSHOT");
    
            ContainerSpec containerSpec = new ContainerSpec("example-container-id", "example-client-name", serverTemplate, releaseId, KieContainerStatus.STOPPED, containerConfigMap);
            client.saveContainerSpec(serverTemplate.getId(), containerSpec);
    
            return containerSpec;
        }
    }

  5. 从项目目录运行配置的 .java 类来执行请求,并查看 Process Automation Manager 控制器响应。

    如果启用了调试日志,KIE 服务器会根据您配置的 marshalling 格式(如 JSON)响应详细响应。如果您遇到请求错误,请查看返回的错误代码信息并相应地调整 Java 配置。