22.3. 带有 KIE 服务器 Java 客户端 API 的请求示例
以下是 KIE 服务器 Java 客户端 API 请求示例,用于与 KIE 服务器基本交互。有关可用 KIE Server Java 客户端的完整列表,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.11.0 源分发,并进入 ~/rhpam-7.11.0-sources/src/droolsjbpm-integration-$VERSION/kie-server-parent/kie-server-remote/kie-server-client/src/main/java/java/org/kie/server/client
。https://access.redhat.com/jbossnetwork/restricted/listSoftware.html
- 列出 KIE 服务器功能
您可以使用
org.kie.server.api.model.KieServerInfo
对象来识别服务器功能。KieServicesClient
客户端需要服务器功能信息才能正确生成服务客户端。您可以在KieServicesConfiguration
中全局指定功能;否则会自动从 KIE 服务器检索它们。返回 KIE 服务器功能的请求示例
public void listCapabilities() { KieServerInfo serverInfo = kieServicesClient.getServerInfo().getResult(); System.out.print("Server capabilities:"); for (String capability : serverInfo.getCapabilities()) { System.out.print(" " + capability); } System.out.println(); }
- 列出 KIE 服务器中的 KIE 容器
KIE 容器由
org.kie.server.api.model.KieContainerResource
对象表示。资源列表由org.kie.server.api.model.KieContainerResourceList
对象表示。从 KIE 服务器返回 KIE 容器的请求示例
public void listContainers() { KieContainerResourceList containersList = kieServicesClient.listContainers().getResult(); List<KieContainerResource> kieContainers = containersList.getContainers(); System.out.println("Available containers: "); for (KieContainerResource container : kieContainers) { System.out.println("\t" + container.getContainerId() + " (" + container.getReleaseId() + ")"); } }
您可以使用
org.kie.server.api.model.KieContainerResourceFilter
类的实例过滤 KIE 容器结果,该实例传递给org.kie.server.client.KieServicesClient.listContainers ()
方法。按发行版本 ID 和状态返回 KIE 容器的请求示例
public void listContainersWithFilter() { // Filter containers by releaseId "org.example:container:1.0.0.Final" and status FAILED KieContainerResourceFilter filter = new KieContainerResourceFilter.Builder() .releaseId("org.example", "container", "1.0.0.Final") .status(KieContainerStatus.FAILED) .build(); // Using previously created KieServicesClient KieContainerResourceList containersList = kieServicesClient.listContainers(filter).getResult(); List<KieContainerResource> kieContainers = containersList.getContainers(); System.out.println("Available containers: "); for (KieContainerResource container : kieContainers) { System.out.println("\t" + container.getContainerId() + " (" + container.getReleaseId() + ")"); } }
- 在 KIE 服务器中创建并分离 KIE 容器
您可以使用
KieServicesClient
客户端中的createContainer
和disposeContainer
方法来忽略并创建 KIE 容器。在本例中,当您分离容器时,ServiceResponse
会返回Void
响应。在创建容器时,ServiceResponse
会返回KieContainerResource
对象。取消和重新创建 KIE 容器的请求示例
public void disposeAndCreateContainer() { System.out.println("== Disposing and creating containers =="); // Retrieve list of KIE containers List<KieContainerResource> kieContainers = kieServicesClient.listContainers().getResult().getContainers(); if (kieContainers.size() == 0) { System.out.println("No containers available..."); return; } // Dispose KIE container KieContainerResource container = kieContainers.get(0); String containerId = container.getContainerId(); ServiceResponse<Void> responseDispose = kieServicesClient.disposeContainer(containerId); if (responseDispose.getType() == ResponseType.FAILURE) { System.out.println("Error disposing " + containerId + ". Message: "); System.out.println(responseDispose.getMsg()); return; } System.out.println("Success Disposing container " + containerId); System.out.println("Trying to recreate the container..."); // Re-create KIE container ServiceResponse<KieContainerResource> createResponse = kieServicesClient.createContainer(containerId, container); if(createResponse.getType() == ResponseType.FAILURE) { System.out.println("Error creating " + containerId + ". Message: "); System.out.println(responseDispose.getMsg()); return; } System.out.println("Container recreated with success!"); }
- 在 KIE 服务器中执行运行时命令
Red Hat Process Automation Manager 支持您可以发送到 KIE 服务器的运行时命令,以获取与资产相关的操作,如在 KIE 会话中插入或重新遍历对象或触发所有规则。支持的运行时命令的完整列表位于 Red Hat Process Automation Manager 实例的
org.drools.core.command.runtime
软件包中。您可以使用
org.kie.api.command.KieCommands
类插入命令,并使用org.kie.api.KieServices.get ().getCommands ()
来实例化KieCommands
类。如果要添加多个命令,请使用BatchExecutionCommand
打包程序。插入对象并触发所有规则的请求示例
import org.kie.api.command.Command; import org.kie.api.command.KieCommands; import org.kie.server.api.model.ServiceResponse; import org.kie.server.client.RuleServicesClient; import org.kie.server.client.KieServicesClient; import org.kie.api.KieServices; import java.util.Arrays; ... public void executeCommands() { String containerId = "hello"; System.out.println("== Sending commands to the server =="); RuleServicesClient rulesClient = kieServicesClient.getServicesClient(RuleServicesClient.class); KieCommands commandsFactory = KieServices.Factory.get().getCommands(); Command<?> insert = commandsFactory.newInsert("Some String OBJ"); Command<?> fireAllRules = commandsFactory.newFireAllRules(); Command<?> batchCommand = commandsFactory.newBatchExecution(Arrays.asList(insert, fireAllRules)); ServiceResponse<String> executeResponse = rulesClient.executeCommands(containerId, batchCommand); if(executeResponse.getType() == ResponseType.SUCCESS) { System.out.println("Commands executed with success! Response: "); System.out.println(executeResponse.getResult()); } else { System.out.println("Error executing rules. Message: "); System.out.println(executeResponse.getMsg()); } }
注意在集群环境中的客户端和特定 KIE 服务器容器之间的对话是由唯一的
对话ID
进行保护的。对话ID
使用X-KIE-ConversationId
REST 标头进行传输。如果更新容器,请取消设置之前的dialogID
。使用KieServiesClient.completeConversation ()
取消 Java API 的 dialogID
。- 列出 KIE 容器中可用的进程
您可以使用
QueryServicesClient
客户端列出可用的进程定义。QueryServicesClient
方法使用分页,因此除了您进行的查询外,还必须提供当前页面和每个页面的结果数。在本例中,查询从页面0
开始,并列出前1000
个结果。列出 KIE 服务器中处理进程的请求示例
public void listProcesses() { System.out.println("== Listing Business Processes =="); QueryServicesClient queryClient = kieServicesClient.getServicesClient(QueryServicesClient.class); List<ProcessDefinition> findProcessesByContainerId = queryClient.findProcessesByContainerId("rewards", 0, 1000); for (ProcessDefinition def : findProcessesByContainerId) { System.out.println(def.getName() + " - " + def.getId() + " v" + def.getVersion()); } }
- 在 KIE 容器中启动批准过程
您可以使用
ProcessServicesClient
客户端启动启动过程。使用addExtraClasses ()
方法,确保您需要的任何自定义类添加到KieServicesConfiguration
对象中。启动业务进程的请求示例
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import org.kie.server.api.marshalling.MarshallingFormat; import org.kie.server.client.KieServicesClient; import org.kie.server.client.KieServicesConfiguration; import org.kie.server.client.KieServicesFactory; import org.kie.server.client.ProcessServicesClient; ... public static void startProcess() { //Client configuration setup KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(SERVER_URL, LOGIN, PASSWORD); //Add custom classes, such as Obj.class, to the configuration Set<Class<?>> extraClassList = new HashSet<Class<?>>(); extraClassList.add(Obj.class); config.addExtraClasses(extraClassList); config.setMarshallingFormat(MarshallingFormat.JSON); // ProcessServicesClient setup KieServicesClient client = KieServicesFactory.newKieServicesClient(config); ProcessServicesClient processServicesClient = client.getServicesClient(ProcessServicesClient.class); // Create an instance of the custom class Obj obj = new Obj(); obj.setOk("ok"); Map<String, Object> variables = new HashMap<String, Object>(); variables.put("test", obj); // Start the process with custom class processServicesClient.startProcess(CONTAINER, processId, variables); }
- 运行自定义查询
您可以使用
QueryServicesClient
客户端的QueryDefinition
对象在 KIE 服务器中注册和执行自定义查询。在 KIE 服务器中注册和执行自定义查询的请求示例
// Client setup KieServicesConfiguration conf = KieServicesFactory.newRestConfiguration(SERVER_URL, LOGIN, PASSWORD); KieServicesClient client = KieServicesFactory.newKieServicesClient(conf); // Get the QueryServicesClient QueryServicesClient queryClient = client.getServicesClient(QueryServicesClient.class); // Build the query QueryDefinition queryDefinition = QueryDefinition.builder().name(QUERY_NAME) .expression("select * from Task t") .source("java:jboss/datasources/ExampleDS") .target("TASK").build(); // Specify that two queries cannot have the same name queryClient.unregisterQuery(QUERY_NAME); // Register the query queryClient.registerQuery(queryDefinition); // Execute the query with parameters: query name, mapping type (to map the fields to an object), page number, page size, and return type List<TaskInstance> query = queryClient.query(QUERY_NAME, QueryServicesClient.QUERY_MAP_TASK, 0, 100, TaskInstance.class); // Read the result for (TaskInstance taskInstance : query) { System.out.println(taskInstance); }
在本例中,
目标
指示查询服务应用默认过滤器。或者,您可以手动设置过滤器参数。Target
类支持以下值:public enum Target { PROCESS, TASK, BA_TASK, PO_TASK, JOBS, CUSTOM; }