第 22 章 KIE 服务器功能和扩展


KIE 服务器中的功能由插件扩展来决定,您可以启用、禁用或进一步扩展以满足您的业务需求。KIE 服务器支持以下默认功能和扩展:

表 22.1. KIE 服务器功能和扩展
功能名称扩展名称描述

KieServer

KieServer

提供 KIE 服务器的核心功能,如在服务器实例中创建并分离 KIE 容器

BRM

Drools

提供业务逻辑管理(BRM)功能,如插入事实和执行新规则

BPM

jBPM

提供 Business Process Management (DSL)功能,如管理用户任务和执行流程

BPM-UI

jBPM-UI

提供额外的用户界面功能,如在进程图中呈现 XML 表单和 SVG 镜像

CaseMgmt

case-Mgmt

为业务流程提供问题单管理功能,如管理问题单定义和里程

BRP

OptaPlanner

提供业务资源规划(BRP)功能,如实施解析器

DMN

DMN

提供决策模型和表示法(DMN)功能,如管理 DMN 数据类型和执行 DMN 模型

Swagger

Swagger

提供用于与 KIE Server REST API 交互的 Swagger web-interface 功能

要查看正在运行的 KIE 服务器实例支持的扩展,请将 GET 请求发送到以下 REST API 端点,并查看 XML 或 JSON 服务器响应:

KIE 服务器信息 GET 请求的基本 URL

http://SERVER:PORT/kie-server/services/rest/server

带有 KIE 服务器信息的 JSON 响应示例

{
  "type": "SUCCESS",
  "msg": "Kie Server info",
  "result": {
    "kie-server-info": {
      "id": "test-kie-server",
      "version": "7.52.0.20190818-050814",
      "name": "test-kie-server",
      "location": "http://localhost:8080/kie-server/services/rest/server",
      "capabilities": [
        "KieServer",
        "BRM",
        "BPM",
        "CaseMgmt",
        "BPM-UI",
        "BRP",
        "DMN",
        "Swagger"
      ],
      "messages": [
        {
          "severity": "INFO",
          "timestamp": {
            "java.util.Date": 1566169865791
          },
          "content": [
            "Server KieServerInfo{serverId='test-kie-server', version='7.52.0.20190818-050814', name='test-kie-server', location='http:/localhost:8080/kie-server/services/rest/server', capabilities=[KieServer, BRM, BPM, CaseMgmt, BPM-UI, BRP, DMN, Swagger]', messages=null', mode=DEVELOPMENT}started successfully at Sun Aug 18 23:11:05 UTC 2019"
          ]
        }
      ],
      "mode": "DEVELOPMENT"
    }
  }
}

要启用或禁用 KIE 服务器扩展,请配置相关的 192.168.1.0/24 server.ext.disabled KIE Server 系统属性。例如,要禁用 BRM 功能,请设置系统属性 org.drools.server.ext.disabled=true。有关所有 KIE 服务器系统属性,请参阅 第 21 章 KIE 服务器系统属性

默认情况下,KIE 服务器扩展通过 REST 或 JMS 数据传输公开,并使用预定义的客户端 API。您可以使用额外的 REST 端点扩展现有 KIE 服务器功能,扩展 REST 或 JMS 以外的支持的传输方法,或者在 KIE Server 客户端中扩展功能。

KIE 服务器功能中的这种灵活性可让您将 KIE 服务器实例适应您的业务需求,而不是将您的业务需求适应默认的 KIE 服务器功能。

重要

如果您扩展了 KIE 服务器功能,红帽不支持用作自定义实现和扩展的自定义代码。

22.1. 使用自定义 REST API 端点扩展现有 KIE 服务器功能

KIE Server REST API 可让您在不使用 Business Central 用户界面的情况下与 Red Hat Process Automation Manager 中的 KIE 容器和业务资产交互。可用的 REST 端点由 KIE 服务器系统属性中启用的功能(例如: org.drools.server.ext.disabled=false 用于 BRM 功能)。您可以使用自定义 REST API 端点扩展现有 KIE 服务器功能,以进一步将 KIE Server REST API 适应您的业务需求。

例如,这个流程使用以下自定义 REST API 端点扩展了 dros KIE Server 扩展(用于 BRM 功能):

自定义 REST API 端点示例

/server/containers/instances/{containerId}/ksession/{ksessionId}

这个示例自定义端点接受要插入到决策引擎工作内存的事实列表,自动执行所有规则,并从指定 KIE 容器中的 KIE 会话检索所有对象。

流程

  1. 创建一个空的 Maven 项目,并在项目的 pom.xml 文件中定义以下打包类型和依赖项:

    示例项目中的 pom.xml 文件示例

    <packaging>jar</packaging>
    
    <properties>
      <version.org.kie>7.52.0.Final-redhat-00007</version.org.kie>
    </properties>
    
    <dependencies>
      <dependency>
        <groupId>org.kie</groupId>
        <artifactId>kie-api</artifactId>
        <version>${version.org.kie}</version>
      </dependency>
      <dependency>
        <groupId>org.kie</groupId>
        <artifactId>kie-internal</artifactId>
        <version>${version.org.kie}</version>
      </dependency>
      <dependency>
        <groupId>org.kie.server</groupId>
        <artifactId>kie-server-api</artifactId>
        <version>${version.org.kie}</version>
      </dependency>
      <dependency>
        <groupId>org.kie.server</groupId>
        <artifactId>kie-server-services-common</artifactId>
        <version>${version.org.kie}</version>
      </dependency>
      <dependency>
        <groupId>org.kie.server</groupId>
        <artifactId>kie-server-services-drools</artifactId>
        <version>${version.org.kie}</version>
      </dependency>
      <dependency>
        <groupId>org.kie.server</groupId>
        <artifactId>kie-server-rest-common</artifactId>
        <version>${version.org.kie}</version>
      </dependency>
      <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-core</artifactId>
        <version>${version.org.kie}</version>
      </dependency>
      <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>${version.org.kie}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
      </dependency>
    </dependencies>

  2. 在项目中的 Java 类中实施 org.kie.server.services.api.KieServerApplicationComponentsService 接口,如下例所示:

    KieServerApplicationComponentsService 接口的实现示例

    public class CusomtDroolsKieServerApplicationComponentsService implements KieServerApplicationComponentsService {  1
    
        private static final String OWNER_EXTENSION = "Drools";  2
    
        public Collection<Object> getAppComponents(String extension, SupportedTransports type, Object... services) {  3
            // Do not accept calls from extensions other than the owner extension:
            if ( !OWNER_EXTENSION.equals(extension) ) {
                return Collections.emptyList();
            }
    
            RulesExecutionService rulesExecutionService = null;  4
            KieServerRegistry context = null;
    
            for( Object object : services ) {
                if( RulesExecutionService.class.isAssignableFrom(object.getClass()) ) {
                    rulesExecutionService = (RulesExecutionService) object;
                    continue;
                } else if( KieServerRegistry.class.isAssignableFrom(object.getClass()) ) {
                    context = (KieServerRegistry) object;
                    continue;
                }
            }
    
            List<Object> components = new ArrayList<Object>(1);
            if( SupportedTransports.REST.equals(type) ) {
                components.add(new CustomResource(rulesExecutionService, context));  5
            }
    
            return components;
        }
    
    }

    1
    为应用启动时部署的 KIE 服务器基础架构提供 REST 端点。
    2
    指定您要扩展的扩展,如本例中的 d ro al 扩展。
    3
    返回 REST 容器必须部署的所有资源。KIE 服务器实例中启用的每个扩展都会调用 getAppComponents 方法,因此 if (!OWNER_EXTENSION.equals (extension) 调用返回空集合,用于指定 OWNER_EXTENSION 扩展以外的任何扩展。
    4
    列出您要使用的指定扩展中的服务,如本例中的 lvs 扩展中的 RulesExecutionServiceKieServerRegistry 服务。
    5
    指定扩展的传输类型,可以是 RESTJMS (本例中为REST ),以及作为组件列表返回资源的 CustomResource 类。
  3. 实现 KIE 服务器可以用来为新 REST 资源提供额外的功能的 CustomResource 类,如下例所示:

    CustomResource 类的实现示例

    // Custom base endpoint:
    @Path("server/containers/instances/{containerId}/ksession")
    public class CustomResource {
    
        private static final Logger logger = LoggerFactory.getLogger(CustomResource.class);
    
        private KieCommands commandsFactory = KieServices.Factory.get().getCommands();
    
        private RulesExecutionService rulesExecutionService;
        private KieServerRegistry registry;
    
        public CustomResource() {
    
        }
    
        public CustomResource(RulesExecutionService rulesExecutionService, KieServerRegistry registry) {
            this.rulesExecutionService = rulesExecutionService;
            this.registry = registry;
        }
    
        // Supported HTTP method, path parameters, and data formats:
        @POST
        @Path("/{ksessionId}")
        @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
        @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
        public Response insertFireReturn(@Context HttpHeaders headers,
                @PathParam("containerId") String id,
                @PathParam("ksessionId") String ksessionId,
                String cmdPayload) {
    
            Variant v = getVariant(headers);
            String contentType = getContentType(headers);
    
            // Marshalling behavior and supported actions:
            MarshallingFormat format = MarshallingFormat.fromType(contentType);
            if (format == null) {
                format = MarshallingFormat.valueOf(contentType);
            }
            try {
                KieContainerInstance kci = registry.getContainer(id);
    
                Marshaller marshaller = kci.getMarshaller(format);
    
                List<?> listOfFacts = marshaller.unmarshall(cmdPayload, List.class);
    
                List<Command<?>> commands = new ArrayList<Command<?>>();
                BatchExecutionCommand executionCommand = commandsFactory.newBatchExecution(commands, ksessionId);
    
                for (Object fact : listOfFacts) {
                    commands.add(commandsFactory.newInsert(fact, fact.toString()));
                }
                commands.add(commandsFactory.newFireAllRules());
                commands.add(commandsFactory.newGetObjects());
    
                ExecutionResults results = rulesExecutionService.call(kci, executionCommand);
    
                String result = marshaller.marshall(results);
    
    
                logger.debug("Returning OK response with content '{}'", result);
                return createResponse(result, v, Response.Status.OK);
            } catch (Exception e) {
                // If marshalling fails, return the `call-container` response to maintain backward compatibility:
                String response = "Execution failed with error : " + e.getMessage();
                logger.debug("Returning Failure response with content '{}'", response);
                return createResponse(response, v, Response.Status.INTERNAL_SERVER_ERROR);
            }
    
        }
    }

    在本例中,自定义端点的 CustomResource 类指定以下数据和行为:

    • 使用基本端点 server/containers/instances/{containerId}/ksession
    • 使用 POST HTTP 方法
    • 预期在 REST 请求中给出以下数据:

      • containerId 作为路径参数
      • ksessionId 作为路径参数
      • 作为消息有效负载的事实列表
    • 支持所有 KIE 服务器数据格式:

      • XML (SPICEB、XStream)
      • JSON
    • 将有效负载解压缩到 List<?> 集合中,对于列表中的每个项目,创建一个 InsertCommand 实例,后跟 FireAllRulesGetObject 命令。
    • 将所有命令添加到调用决策引擎的 BatchExecutionCommand 实例中。
  4. 要使 KIE 服务器可以发现新的端点,请在 Maven 项目中创建一个 META-INF/services/org.kie.server.services.api.KieServerApplicationComponentsService 文件,并在文件中添加 KieServerApplicationComponentsService 实现类的完全限定类名称。在本例中,文件包含一行 org.kie.server.ext.drools.rest.CusomtDroolsKieServerApplicationComponentsService
  5. 构建您的项目,并将生成的 JAR 文件复制到项目的 ~/kie-server.war/WEB-INF/lib 目录中。例如,在 Red Hat JBoss EAP 上,此目录的路径是 EAP_HOME/standalone/deployments/kie-server.war/WEB-INF/lib
  6. 启动 KIE 服务器,并将构建的项目部署到正在运行的 KIE 服务器中。您可以使用 Business Central 接口或 KIE Server REST API ( PUT 请求 http://SERVER:PORT/kie-server/services/rest/server/containers/{containerId})来部署项目。

    在项目部署到正在运行的 KIE 服务器上后,您可以开始与您的新 REST 端点交互。

    在本例中,您可以使用以下信息来调用新端点:

    • 请求 URL 示例: http://localhost:8080/kie-server/services/rest/server/containers/instances/demo/ksession/defaultKieSession
    • HTTP 方法: POST
    • HTTP 标头:

      • content-Type: application/json
      • 接受:application/json
    • 消息有效负载示例:

      [
        {
          "org.jbpm.test.Person": {
            "name": "john",
            "age": 25
          }
        },
        {
          "org.jbpm.test.Person": {
            "name": "mary",
            "age": 22
          }
        }
      ]
    • 服务器响应示例: 200 (成功)
    • 服务器日志输出示例:

      13:37:20,347 INFO  [stdout] (default task-24) Hello mary
      13:37:20,348 INFO  [stdout] (default task-24) Hello john
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.