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


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

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

KieServer

KieServer

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

BRM

grafana

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

BPM

jBPM

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

BPM-UI

jBPM-UI

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

CaseMgmt

case-Mgmt

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

BRP

OptaPlanner

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

DMN

DMN

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

Swagger

Swagger

提供 Swagger web-interface 功能与 KIE 服务器 REST API 交互

要查看正在运行的 KIE 服务器实例的支持的扩展,请将 GET 请求发送到以下 REST API 端点,并查看 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.67.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.67.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 服务器系统属性。例如,要禁用 BRM 功能,请设置系统属性 org.drools.server.ext.disabled=true。有关所有 KIE 服务器系统属性,请参阅 第 20 章 KIE 服务器系统属性

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

KIE 服务器功能中的这一灵活性使您能够根据业务需求调整 KIE 服务器实例,而不必为默认 KIE 服务器功能适应您的业务需求。

重要

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

KIE 服务器 REST API 可让您与红帽流程自动化管理器中的 KIE 容器和商业资产(如业务规则、流程和解决方案)进行交互,而无需使用 Business Central 用户界面。可用的 REST 端点由 KIE 服务器系统属性中启用了的功能决定(例如,/ org.drools.server.ext.disabled=false 表示 ECDSA 功能)。您可以使用自定义 REST API 端点扩展现有 KIE 服务器功能,以进一步调整 KIE 服务器 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.67.0.Final-redhat-00024</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
    指定扩展的传输类型(即 REST )(本例中为REST ),以及返回资源作为 组件 列表一部分的 CustomResource 类。
  3. 实施 KIE 服务器可以用来为新的 REST 资源提供额外的功能,如下例所示:

    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
    • Unmarshals 在 List<?& gt; 集合中,为列表中的每个项目创建一个 InsertCommand 实例,后跟 FireAllRulesGetObject 命令。
    • 将所有命令添加到调用决策引擎的 BatchExecutionCommand 实例中。
  4. 要使新端点可以被 KIE 服务器发现,请在 文件中创建一个 META-INF/services/org.kie.server.api.KieServerApplicationApplicationComponentsService 文件,并添加 KieApplicationApplicationComponentsService 实施类的完全限定域名。在本例中,该文件包含一行 org.kie.server.ext.drools.rest.CusomtDroolsKieServerComponentsService
  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 服务器上部署项目后,您可以开始与新的 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