Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期 (3)

就可以启动我们的业务流程了,选择Processes页,在[月度财报]的[操作]列点击[启动流程]

在这里插入图片描述

流程会执行到第一个用户任务.因为我们以kermit登录,在启动流程实例之后,就可以看到有了一个新的待领任务.选择任务页来查看这条新任务.注意即使流程被其他人启动,任务还是会被会计组里的所有人作为一个候选任务看到

-

领取任务

现在一个会计要认领这个任务

认领以后,这个用户就会成为任务的执行人,任务会从会计组的其他成员的任务列表中消失.认领任务的代码:

taskService.claim(task.getId(), "fozzie");

任务会进入认领任务人的个人任务列表:

List<Task> tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();

在Activiti Explorer UI中,点击认领按钮,会执行相同的操作.任务会移动到登录用户的个人任务列表.你也会看到任务的执行人已经变成当前登陆的用户:

在这里插入图片描述

完成任务

现在会计可以开始进行财报的工作

报告完成后,他可以完成任务,意味着任务所需的所有工作都完成

taskService.complete(task.getId());

对于Activiti引擎:

需要一个外部信息来让流程实例继续执行

任务会把自己从运行库中删除

流程会沿着单独一个外出连线执行,移动到第二个任务(审批报告)

与第一个任务相同的机制会使用到第二个任务上,不同的是任务是分配给management组

在demo中:

完成任务是通过点击任务列表中的完成按钮

因为Fozzie不是会计,我们先从Activiti Explorer注销

然后使用kermit登陆(经理),第二个任务会进入未分配任务列表

结束流程

审批任务像之前一样查询和领取.

完成第二个任务会让流程执行到结束事件,就会结束流程实例

流程实例和所有相关的运行数据都会从数据库中删除

登录Activiti Explorer就可以进行验证,可以看到保存流程运行数据的表中已经没有数据:

在这里插入图片描述

可以使用historyService判断流程是否已经结束:

HistoryService historyService = processEngine.getHistoryService(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult(); System.out.println("Process instance end time: " + historicProcessInstance.getEndTime()); 源码

考虑到你可能会在Activiti Explorer UI中启动一些流程实例,这样,它会获得多个任务,而不是一个,所以代码可以一直正常运行:

public class TenMinuteTutorial { public static void main(String[] args) { // Create Activiti process engine ProcessEngine processEngine = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration() .buildProcessEngine(); // Get Activiti services RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); // Deploy the process definition repositoryService.createDeployment() .addClasspathResource("FinancialReportProcess.bpmn20.xml") .deploy(); // Start a process instance String procId = runtimeService.startProcessInstanceByKey("financialReport").getId(); // Get the first task TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list(); for (Task task : tasks) { System.out.println("Following task is available for accountancy group: " + task.getName()); // claim it taskService.claim(task.getId(), "fozzie"); } // Verify Fozzie can now retrieve the task tasks = taskService.createTaskQuery().taskAssignee("fozzie").list(); for (Task task : tasks) { System.out.println("Task for fozzie: " + task.getName()); // Complete the task taskService.complete(task.getId()); } System.out.println("Number of tasks for fozzie: " + taskService.createTaskQuery().taskAssignee("fozzie").count()); // Retrieve and claim the second task tasks = taskService.createTaskQuery().taskCandidateGroup("management").list(); for (Task task : tasks) { System.out.println("Following task is available for accountancy group: " + task.getName()); taskService.claim(task.getId(), "kermit"); } // Completing the second task ends the process for (Task task : tasks) { taskService.complete(task.getId()); } // verify that the process is actually finished HistoryService historyService = processEngine.getHistoryService(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult(); System.out.println("Process instance end time: " + historicProcessInstance.getEndTime()); } } 总结

可以通过Activiti中的BPMN 2.0结构,对业务流程进行以下方面的:

定义网关来实现决策环节: 经理可以驳回财报,重新给会计创建一个任务

考虑使用变量: 可以保存或引用报告,把它显示到表单中

在流程最后加入服务任务: 把报告发给每个领导

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxgfw.html