版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kmyhy/article/details/90171030
Kie Server 提供了 REST API,这些 API 是以 http://localhost:8080/kie-server/services/rest
开始的 API。
API 文档: https://www.jbpm.org/api-docs/kie-server/paths.html ,Swagger 文档地址: http://localhost:8080/kie-server/docs
业务中心(Business Central)也提供了类似的 API,端点地址以 http://localhost:8080/business-central/rest
开始。你可以使用这两套 API 中的任意一种,也可以两者一起使用。Swagger 文档地址: http://localhost:8080/kie-server/docs
这些 API 的访问方式十分简单,直接通过浏览器或者 postman 访问 API 端点地址即可。
jBPM 使用 Basic Auth 进行登录认证,如果使用 postman 的话,请设置 Authorization 为 Basic Auth。
要在 java 中使用 REST API,需要引入 kie-remote-client 包,目前最新版本是 7.18.0 Final。
<dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-client</artifactId> <version>${runtime.version}</version> </dependency>
对远程 API 调用的方法都封装在 KieServerCalls 类中。KieServerCalls 同时会保存一些服务器相关的参数,比如远程服务器地址、容器 id、服务器管理员登录账号和密码。要启动流程实例,首先需要构造一个 KieServerCalls 对象,并通过它的构造方法来指定这些参数:
KieServerCalls kieServerCalls = new KieServerCalls(SERVER_URL, CONTAINER_ID,ADMIN_USER, ADMIN_PWD);
然后构造流程实例变量:
Map<String, Object> params = new HashMap<String, Object>(); params.put("applicant", "zhangsan1"); ...
然后在启动流程时传入流程实例变量:
Long processInstanceId = kieServerCalls.startProcess(CONTAINER_ID,PROCESS_ID,params);
startProcess 方法启动了流程实例:
public Long startProcess(String containerId, String processId, Map<String, Object> params) { ProcessServicesClient processClient = kieServicesClient.getServicesClient(ProcessServicesClient.class); Long processInstanceId = processClient.startProcess(containerId, processId, params); System.out.println("processInstanceId: " + processInstanceId); return processInstanceId; }
可以看到,通过远程 API 启动流程实例和之前稍有不同。首先需要构建一个 KieServicesConfiguration 对象,用这个对象设置一些必要参数,比如用户名密码。然后用这个对象创建一个 KieServicesClient(这两个对象在构造方法中初始化)。然后通过 KieServicesClient 获取服务,比如 processService,然后再用 processService 启动流程 —— 注意,启动流程时传入了流程变量。
远程 API 有许多类都以 Client 结尾。
然后是查询待办:
List<TaskSummary> tasks = kieServerCalls.findTasksAssignedAsPotentialOwner(userId, pwd);
它调用了 kieServerCalls 的 findTasksAssignedAsPotentialOwner 方法:
public List<TaskSummary> findTasksAssignedAsPotentialOwner(String user, String password) { KieServicesConfiguration configuration = KieServicesFactory.newRestConfiguration(kieServerUrl, user, password); configuration.setMarshallingFormat(MarshallingFormat.JAXB); KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(configuration); UserTaskServicesClient taskClient = kieServicesClient.getServicesClient(UserTaskServicesClient.class); List<TaskSummary> tasks = null; try { tasks = taskClient.findTasksAssignedAsPotentialOwner(user, 0, 10); } catch (Exception e) { e.printStackTrace(); } System.out.println("Tasks: " + tasks + "; tasks.size() = " + tasks.size()); return tasks; }
远程 API 在调用时需要对用户身份进行验证,所以参数中需要传入用户名和密码。这里的用户和启动流程时的用户不是同一个,启动流程时使用的是管理员用户 krisv,而查询待办时使用的用户是普通用户,比如 zhangsan1。
这里的用户,比如 zhangsan1 和 krisv,必须是在业务中心(workbench)中真实存在的用户。
因为用户名密码是通过 KieServicesConfiguration 来设置的,所以这里需要重新 new 一个 KieServicesConfiguration,并设置新的用户名和密码。然后用这个设置创建新的 KieServicesClient,才能查询到 zhangsan1 的待办。如果你共用类的 configuration 对象和 kieServicesClient 去查询待办,那么只能查到空列表。
处理节点任务时,通常需要准备输出参数:
Map<String, Object> outParams = new HashMap<String, Object>(); outParams.put("applicantSubmit_out", true);// 设置任务的输出变量。
然后调用 completeTask 完成任务:
kieServerCalls.completeTask(userId,pwd,tasks.get(0).getId(),outParams);
completeTask 方法定义如下:
public void completeTask(String user, String password, Long taskId, Map<String, Object> params) { KieServicesConfiguration configuration = KieServicesFactory.newRestConfiguration(kieServerUrl, user, password); configuration.setMarshallingFormat(MarshallingFormat.JAXB); KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(configuration); UserTaskServicesClient taskClient = kieServicesClient.getServicesClient(UserTaskServicesClient.class); System.out.println("Complete task: " + taskId); taskClient.startTask(containerId, taskId, user); taskClient.completeTask(containerId, taskId, user, params); }
同理,办理任务时也需要验证用户名密码,因为每次办理任务时,很可能不会是同一个用户,因此也只能使用新的 configuration 和 servicesCliet 进行办理。