转载

JBPM 7.17 学习笔记(10)REST API

版权声明:本文为博主原创文章,未经博主允许不得转载。 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。

kie-remote-client API

要在 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 进行办理。

原文  https://blog.csdn.net/kmyhy/article/details/90171030
正文到此结束
Loading...