第 16 章 KIE 服务器功能和扩展
KIE 服务器的功能由插件扩展决定,您可以启用、禁用或进一步扩展以满足您的业务需求。KIE 服务器支持以下默认功能和扩展:
功能名称 | 扩展名称 | 描述 |
---|---|---|
|
| 提供 KIE 服务器的核心功能,如在服务器实例上创建和处理 KIE 容器 |
|
| 提供商业规则管理(BRM)功能,如插入事实和执行业务规则 |
|
| 提供业务资源规划(BRP)功能,比如实施解决者 |
|
| 提供 Decision Model 和 Notation(DMN)功能,如管理 DMN 数据类型和执行 DMN 模型 |
|
| 提供 Swagger web-interface 功能与 KIE 服务器 REST API 交互 |
要查看正在运行的 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.67.0.20190818-050814", "name": "test-kie-server", "location": "http://localhost:8080/kie-server/services/rest/server", "capabilities": [ "KieServer", "BRM", "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, BRP, DMN, Swagger]', messages=null', mode=DEVELOPMENT}started successfully at Sun Aug 18 23:11:05 UTC 2019" ] } ], "mode": "DEVELOPMENT" } } }
要启用或禁用 KIE 服务器扩展,请配置相关的 *.server.ext.disabled
KIE 服务器系统属性。例如,要禁用 BRM
功能,请设置系统属性 org.drools.server.ext.disabled=true
。有关所有 KIE 服务器系统属性,请参阅 第 15 章 KIE 服务器系统属性。
默认情况下,KIE 服务器扩展通过 REST 或 JMS 数据传输提供,并使用预定义的客户端 API。您可以使用其他 REST 端点扩展现有 KIE 服务器功能,将支持的传输方法扩展到 REST 或 JMS 外,或者在 KIE 服务器客户端中扩展功能。
KIE 服务器功能中的这一灵活性使您能够根据业务需求调整 KIE 服务器实例,而不必为默认 KIE 服务器功能适应您的业务需求。
如果您扩展了 KIE 服务器功能,红帽不支持用作自定义实现和扩展一部分的自定义代码。
16.1. 使用自定义 REST API 端点扩展现有 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}
这个示例自定义端点接受插入到决策引擎工作内存的列表,自动执行所有规则,并从指定的 KIE 容器中的 KIE 会话检索所有对象。
流程
创建一个空的 Maven 项目,并在项目的
pom.xml
文件中定义以下打包类型和依赖项:示例项目中的 pom.xml 文件示例
<packaging>jar</packaging> <properties> <version.org.kie>7.67.0.Final-redhat-00019</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>
在项目中的 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
- 指定您要扩展的扩展,如本例中的
Drools
扩展。 - 3
- 返回 REST 容器必须部署的所有资源。在 KIE 服务器实例中启用的每个扩展会调用
getAppComponents
方法,因此if(!OWNER_EXTENSION.equals(extension))
调用为除指定的OWNER_EXTENSION
扩展以外的扩展返回空集合。 - 4
- 列出您要使用的指定扩展中的服务,如本例中的
Drools
扩展中的RulesExecutionService
和KieServerRegistry
服务。 - 5
- 指定扩展的传输类型(即
REST
)(本例中为REST
),以及返回资源作为组件
列表一部分的CustomResource
类。
实施 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); } } }
在本例中,自定义端点的
CustomResource
类指定以下数据和行为:-
使用基本端点
server/containers/instances/{containerId}/ksession
-
使用
POST
HTTP 方法 预期在 REST 请求中给出了以下数据:
-
containerId
作为路径参数 -
ksessionId
作为路径参数 - 将事实列为消息有效负载
-
支持所有 KIE 服务器数据格式:
- XML(JAXB、XStream)
- JSON
-
Unmarshals 在
List<?&
gt; 集合中,为列表中的每个项目创建一个InsertCommand
实例,后跟FireAllRules
和GetObject
命令。 -
将所有命令添加到调用决策引擎的
BatchExecutionCommand
实例中。
-
使用基本端点
-
要使新端点可以被 KIE 服务器发现,请在 文件中创建一个
META-INF/services/org.kie.server.api.KieServerApplicationApplicationComponentsService
文件,并添加KieApplicationApplicationComponentsService
实施类的完全限定域名。在本例中,该文件包含一行org.kie.server.ext.drools.rest.CusomtDroolsKieServerComponentsService
。 -
构建您的项目,并将生成的 JAR 文件复制到项目的
~/kie-server.war/WEB-INF/lib
目录中。例如,在红帽 JBoss EAP 上,此目录的路径是EAP_HOME/standalone/deployments/kie-server.war/WEB-INF/lib
。 启动 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 } } ]
-
服务器响应示例:
200
(success) 服务器日志输出示例:
13:37:20,347 INFO [stdout] (default task-24) Hello mary 13:37:20,348 INFO [stdout] (default task-24) Hello john
-
请求 URL 示例: