就可以启动我们的业务流程了,选择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结构,对业务流程进行以下方面的:
定义网关来实现决策环节: 经理可以驳回财报,重新给会计创建一个任务
考虑使用变量: 可以保存或引用报告,把它显示到表单中
在流程最后加入服务任务: 把报告发给每个领导