Activiti7集成SpringBoot2官方实例(五):添加ReST调用以列出可用的用户任务

@高效码农  June 25, 2019

随着流程的运行,我们应该能够列出可用任务,然后查看作为流程定义中第一个活动的用户任务。
org/activiti/training/activiti7apibasicprocessusertaskservicetaskevents/rest包中添加一个名为 TaskManagementController 的新Spring MVC控制器,如下所示:

package org.activiti.training.activiti7apibasicprocessusertaskservicetaskevents.rest;

import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.TaskPayloadBuilder;
import org.activiti.api.task.runtime.TaskAdminRuntime;
import org.activiti.api.task.runtime.TaskRuntime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class TaskManagementController {
 private Logger logger = LoggerFactory.getLogger(TaskManagementController.class);

 @Autowired
 private TaskRuntime taskRuntime;

 @GetMapping("/my-tasks")
 public List<Task> getMyTasks() {
 Page<Task> tasks = taskRuntime.tasks(Pageable.of(0, 10));
 logger.info("> My Available Tasks: " + tasks.getTotalItems());

 for (Task task : tasks.getContent()) {
 logger.info("\t> My User Task: " + task);
 }

 return tasks.getContent();
 }
}

首先注入 TaskRuntime Spring bean,以便我们可以使用Task Runtime API。此API将与当前用户相关的任务一起使用。因此,当我们调用 tasks()方法时,它将返回分配给当前登录用户的任务。API具有以下方法:

public interface TaskRuntime {
 TaskRuntimeConfiguration configuration();
 Task task(String var1);
 Page<Task> tasks(Pageable var1);
 Page<Task> tasks(Pageable var1, GetTasksPayload var2);
 Task create(CreateTaskPayload var1);
 Task claim(ClaimTaskPayload var1);
 Task release(ReleaseTaskPayload var1);
 Task complete(CompleteTaskPayload var1);
 Task update(UpdateTaskPayload var1);
 Task delete(DeleteTaskPayload var1);
 List<VariableInstance> variables(GetTaskVariablesPayload var1);
 void setVariables(SetTaskVariablesPayload var1);
}

在这种情况下,我们只需要 tasks() 方法。在 /my-tasks URL路径用于该休息GET调用。

当我们想要查看在所有活动流程实例中分配的所有任务时,我们还可以添加ReST调用。可用于支持和管理目的,例如当您想要代表某人重新分配任务或完成任务时。此调用将需要管理员凭据(即我们需要以具有 ROLE_ACTIVITI_ADMIN 的用户身份登录)。我们还需要使用名为 TaskAdminRuntime 的不同运行时API 。这是方法:

...
@Autowired
private TaskAdminRuntime taskAdminRuntime;
...
@GetMapping("/all-tasks")
public List<Task> getAllTasks() {
 Page<Task> tasks = taskAdminRuntime.tasks(Pageable.of(0, 10));
 logger.info("> All Available Tasks: " + tasks.getTotalItems());

 for (Task task : tasks.getContent()) {
 logger.info("\t> User Task: " + task);
 }

 return tasks.getContent();
}

现在,按照前面的描述打包并运行应用程序。启动应用程序时,您应该看到指示所有内容都已正确实现的日志:

...

2018-08-30 09:09:47.757  INFO 36063 --- [  main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/my-tasks],methods=[GET]}" onto public java.util.List<org.activiti.runtime.api.model.Task> org.activiti.training.activiti7apibasicprocessusertaskservicetaskevents.rest.TaskManagementController.getMyTasks()

2018-08-30 09:09:47.757  INFO 36063 --- [  main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/all-tasks],methods=[GET]}" onto public java.util.List<org.activiti.runtime.api.model.Task> org.activiti.training.activiti7apibasicprocessusertaskservicetaskevents.rest.TaskManagementController.getAllTasks()

...

当我们运行内存数据库时,我们之前启动的流程实例将在重新启动后消失,创建一个新的 http://localhost:8080/start-process?processDefinitionKey=sampleproc-e9b76ff9-6f70-42c9-8dee-f6116c533a6d。

我启动了以用户 mbergljung身份登录的流程实例。因为用户任务被分配给用户 testuser, 所以当我们调用 taskRuntime.tasks() 时它不会显示。在继续下面的ReST调用之前,我们必须以 testuser 身份注销并再次登录(最简单的方法是在下次ReST调用之前清除浏览器缓存)。

然后键入以下URL: http://localhost:8080/my-tasks,然后您应该得到如下所示的响应:

[
 {
 id: "b0a60cb6-fa2b-11e8-9c34-acde48001122",
 name: "User Task 1",
 status: "ASSIGNED",
 assignee: "testuser",
 createdDate: "2018-12-07T14:23:38.896+0000",
 priority: 50,
 processDefinitionId: "c68315b2-fa2a-11e8-9c34-acde48001122",
 processInstanceId: "b0a28a43-fa2b-11e8-9c34-acde48001122"
 }
]

在日志中,您应该看到以下内容:

2018-08-30 09:50:09.753  INFO 36063 --- [nio-8080-exec-9] o.a.t.a.rest.TaskManagementController    : > My Available Tasks: 1

2018-08-30 09:50:09.754  INFO 36063 --- [nio-8080-exec-9] o.a.t.a.rest.TaskManagementController    : > My User Task: TaskImpl{id='b0a60cb6-fa2b-11e8-9c34-acde48001122', owner='null', assignee='testuser', name='User Task 1', description='null', createdDate=Fri Dec 07 14:23:38 GMT 2018, claimedDate=null, dueDate=null, priority=50, processDefinitionId='c68315b2-fa2a-11e8-9c34-acde48001122', processInstanceId='b0a28a43-fa2b-11e8-9c34-acde48001122', parentTaskId='null', formKey='null', status=ASSIGNED}

现在,通过清除浏览器缓存注销,然后点击 http://localhost:8080/all-tasks。当要求登录时使用 admin/1234 凭据。作为响应,您应该看到相同的用户任务。



评论已关闭