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


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

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

KieServer

KieServer

提供 KIE 服务器的核心功能,例如在您的服务器实例上创建和处理 KIE 容器

BRM

Drools

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

BPM

jBPM

提供业务流程管理(BPM)功能,如管理用户任务和执行流程

BPM-UI

jBPM-UI

提供额外的与业务流程相关的用户界面功能,如在流程图中呈现 XML 表单和 SVG 镜像

CaseMgmt

Case-Mgmt

为业务流程提供案例管理功能,如管理案例定义和里程碑

BRP

OptaPlanner

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

DMN

DMN

提供 Decision Model 和 Notation (DMN)功能,如管理 DMN 数据类型和执行 DMN 模型

Swagger

Swagger

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

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

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

http://SERVER:PORT/kie-server/services/rest/server
Copy to Clipboard Toggle word wrap

使用 KIE 服务器信息的 JSON 响应示例

{
  "type": "SUCCESS",
  "msg": "Kie Server info",
  "result": {
    "kie-server-info": {
      "id": "test-kie-server",
      "version": "7.59.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.59.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"
    }
  }
}
Copy to Clipboard Toggle word wrap

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

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

KIE 服务器功能中的这种灵活性使您能够根据业务需求调整 KIE 服务器实例,而不是将业务需求适应您的业务需求。

重要

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

KIE 服务器 REST API 允许您在红帽流程自动化管理器中与 KIE 容器和业务资产(如业务规则、流程和解决程序)交互,而无需使用 Business Central 用户界面。可用的 REST 端点由 KIE 服务器系统属性中启用的功能决定(例如,对于 BRM 功能的 org.drools.server.ext.disabled=false )。您可以使用自定义 REST API 端点扩展现有的 KIE 服务器功能,以进一步根据业务需求调整 KIE Server REST API。

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

自定义 REST API 端点示例

/server/containers/instances/{containerId}/ksession/{ksessionId}
Copy to Clipboard Toggle word wrap

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

流程

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

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

    <packaging>jar</packaging>
    
    <properties>
      <version.org.kie>7.59.0.Final-redhat-00006</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>
    Copy to Clipboard Toggle word wrap

  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;
        }
    
    }
    Copy to Clipboard Toggle word wrap

    1
    为应用程序启动时部署的 KIE 服务器基础架构提供 REST 端点。
    2
    指定您要扩展的扩展,如本例中的 Drools 扩展。
    3
    返回 REST 容器必须部署的所有资源。在 KIE 服务器实例中启用的每个扩展都会调用 getAppComponents 方法,因此 if (!OWNER_EXTENSION.equals (extension) 调用会为指定 OWNER_EXTENSION 扩展以外的任何扩展返回一个空集合。
    4
    列出要使用的指定扩展中的服务,如本例中的 Drools 扩展中的 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);
            }
    
        }
    }
    Copy to Clipboard Toggle word wrap

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

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

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

      • XML (JAXB、XStream)
      • JSON
    • 将有效负载放入 List<?> 集合,对于列表中的每个项目,创建一个 InsertCommand 实例,后跟 FireAllRulesGetObject 命令。
    • BatchExecutionCommand 实例添加调用决策引擎的所有命令。
  4. 要使 KIE Server 的新端点发现,请在 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 目录中。例如,在红帽 JBoss EAP 上,此目录的路径为 EAP_HOME/standalone/deployments/kie-server.war/WEB-INF/lib
  6. 启动 KIE 服务器,并将构建的项目部署到正在运行的 KIE 服务器。您可以使用 Business Central 接口或 KIE 服务器 REST API 部署项目( PUT 请求 http://SERVER:PORT/kie-server/services/rest/server/containers/{containerId})。

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

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

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

      • Content-Type: application/json
      • accept: application/json
    • 消息有效负载示例:

      [
        {
          "org.jbpm.test.Person": {
            "name": "john",
            "age": 25
          }
        },
        {
          "org.jbpm.test.Person": {
            "name": "mary",
            "age": 22
          }
        }
      ]
      Copy to Clipboard Toggle word wrap
    • 服务器响应示例: 200 (success)
    • 服务器日志输出示例:

      13:37:20,347 INFO  [stdout] (default task-24) Hello mary
      13:37:20,348 INFO  [stdout] (default task-24) Hello john
      Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat