22.3. KIE Server Java クライアント API を使用した要求の例
以下は、KIE Server と基本的な対話を行うための KIE Server Java クライアント API 要求の例です。利用可能な KIE Server Java クライアントの完全一覧は、Red Hat カスタマーポータル から Red Hat Process Automation Manager 7.13.5 Source Distribution をダウンロードして、~/rhpam-7.13.5-sources/src/droolsjbpm-integration-$VERSION/kie-server-parent/kie-server-remote/kie-server-client/src/main/java/org/kie/server/client に移動してください。
- KIE Server の機能リスト
org.kie.server.api.model.KieServerInfoオブジェクトを使用すると、サーバー機能を特定できます。KieServicesClientクライアントが適切にサービスクライアントを生成するには、サーバー機能の情報が必要です。このケーパビリティーはKieServicesConfigurationでグローバルに指定することができます。指定しない場合は、KIE Server から自動的に取得します。KIE Server ケーパビリティーを返す要求の例
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 Server での KIE コンテナーのリスト
KIE コンテナーは
org.kie.server.api.model.KieContainerResourceオブジェクトで表されます。リソースリストは、org.kie.server.api.model.KieContainerResourceListオブジェクトで表されます。KIE Server から 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 Server での 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 Server でのランタイムコマンドの実行
Red Hat Process Automation Manager はランタイムコマンドをサポートしています。これは、KIE セッションでオブジェクトを挿入したり取り消したり、全ルールを実行するなどのアセット関連の操作のために KIE Server に送信するものです。サポートされるランタイムコマンドの全リストは、Red Hat Process Automation Manager インスタンスの
org.drools.core.command.runtimeパッケージにあります。コマンドの挿入には
org.kie.api.command.KieCommandsクラスを使用し、KieCommandsクラスのインスタンス化にはorg.kie.api.KieServices.get().getCommands()を使用することもできます。複数のコマンドを追加するには、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 Server コンテナーとの対話は、一意の
conversationIDでセキュリティーが保たれます。conversationIDはX-KIE-ConversationIdREST ヘッダーを使用して送信されます。コンテナーを更新する場合は、以前のconversationIDの設定を解除します。KieServiesClient.completeConversation()を使用して Java API のconversationIDを設定解除します。- KIE コンテナーで利用可能なビジネスプロセスのリスト
QueryServicesClientクライアントを使用すると、利用可能なプロセス定義をリスト表示できます。QueryServicesClientメソッドはページネーションを使用するため、実行するクエリーの他に現在のページと 1 ページごとの結果数を提供する必要があります。この例では、クエリーはページ0から始まり、最初の1000件の結果を表示します。KIE Server でのビジネスプロセスリスト要求の例
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 Server でカスタムクエリーを登録および実行します。KIE Server でのカスタムクエリー登録要求および実行要求の例
// 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がクエリーサービスにデフォルトフィルターを適用するように指示しています。別の方法では、フィルターのパラメーターを手動で設定することもできます。Targetクラスは以下の値をサポートしています。public enum Target { PROCESS, TASK, BA_TASK, PO_TASK, JOBS, CUSTOM; }