图 3 所示。
流程图对应的文件 audit.xml 部分如下:
上述为一个流程文件部分内容。该文件中的 process 元素用于描述流程信息,而 bpmndi;BPMNDiagram 元素则用于描述流程节点的位置信息。在 process 元素中定义了开始事件 srartEvent、两个 usertask 和结束事件 endEvent 以及连接这些元素的顺序流(sequenceFlow)。
3.2.2 部署工作流
把工作流部署到工作流引擎中:
@Test
public void deploy(){ // 获取仓库服务 : 管理流程定义
RepositoryService repositoryService = processEngine.getRepositoryService():
Deployment deploy = repositoryService.createDeployment()// 创建一个部署的构建器
.addClasspathResource("LeaveActiviti.bpmn")// 添加资源 , 一次只能添加一个
.name(" 请求单流程 ")// 设置部署的名称
.category(" 办公类别 ")// 设置部署的类别
.deploy():
System.out.println(" 部署的 id"+deploy.getId()):
System.out.println(" 部署的名称 "+deploy.getName()):}
3.2.3 执行工作流
指定执行刚才部署的工作流就是我们定义时设置的工作流程图中的当前任务 id:
@Test
public void startProcess(){ // 指定执行我们刚才部署的工作流程
String processDefiKey="leaveBill": // 取运行时服务
RuntimeService runtimeService = processEngine.getRuntimeService():// 取得流程实例
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey):
System.out.println(" 流程实例 id;"+pi.getId()):// 流程实例 id
System.out.println(" 流程定义 id;"+pi.getProcessDefinitionId()):// 输出流程定义的 id}
3.2.4 查看任务信息
根据任务办理人,查看当前任务信息:
@Test
public void queryTask(){// 任务的办理人
String assignee=" 办理人 ": // 取得任务服务
TaskService taskService = processEngine.getTaskService(): // 创建一个任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery():// 办理人的任务列表
List list = taskQuery.taskAssignee(assignee)//指定办理人
.list(): // 遍历任务列表
if(list!=null&&list.size()>0){
for(Task task;list){
System.out.println(" 任务的办理人 : "+task.getAssignee()):
System.out.println(" 任务的 id: "+task.getId()):
System.out.println(" 任务的名称 : "+task.getName()):
}}}
3.2.5 处理当前任务
当前任务的 id 已经查询出来了,处理 id 为 304 的这个任务:
@Test
public void compileTask(){
String taskId="304": //taskId: 任务 id
processEngine.getTaskService().complete(taskId):
System.out.println(" 当前任务执行完毕 "):}
3.2.6 删除流程
删除部署 id=101 这个流程定义的数据:
@Test
public void deleteProcessDefi(){
// 通过部署 id 来删除流程定义
String deploymentId="101":
processEngine.getRepositoryService().deleteDeployment(deploymentId):
}
4 Activiti 问题总结
在实际的项目开发过程中,笔者不断遇到了一些问题与挑战,同时也积累了一些经验。从 Activiti 数据库的连接;到排他网关与并行网关的不同设置;再到执行监听器的配置与使用,任务监听器的配置与使用等等的入坑事件。下面总结几个遇到的比较典型的问题。
4.1 会签功能
实际项目中会碰到某个任务节点需要实现会签功能的要求,就是指一个任务需要多人进行审批,多人都审批通过后,流程才能继续往下走。目前的实现方式为:
(1)启动这个流程图时,遍历所有任务,获取当前任务的办理人;
(2)将任务办理人做成一个集合,每个办理人元素用逗号分隔;
(3)将这个集合的键以 Publicitylist_ 加上当前的元素ID,值以前面获取到的集合放入 Activiti 上下文。将这个参数作为 Activiti 启动参数放入即可。
4.2 回退功能
实际项目中还会碰到某个任务节点需要实现回退功能的要求。就是指能够回退到流程图上的任意节点,Activiti 无法满足这样的项目需求,就需要进行二次开发封装。目前的实现方式为:
(1)获取当前任务所在的节点;
(2)获取当前节点的流出方向;
(3)记住当前节点的流出信息,并将当前节点的流出信息清空;
(4)获取目标节点;
(5)创建新的方向;
(6)将新的方向设置为当前节点的流出方向;
(7)完成当前任务;
(8)还原当前节点的流出方向。
5 结 论
在实际的项目开发过程中,工作流管理的好处是能实实在在感受到的,工作流管理在项目管理软件中是有很大的发展空间的。笔者简要总结了以下几点:软件的过程控制可见,清晰明了,客户满意度提高;工作流的可配置性提高,直接减少了软件开发、后期维护成本;增强了系统的适应性,能够快速适应客户提出的流程变化。
参考文献:
[1] 程序人生丶 .activiti 入坑总结 [EB/OL].(2019-02-20).https://www.jianshu.com/p/5c0e43701d51.html.
[2] Java3y.Activiti 就是这么简单 [EB/OL].(2018-03-21).https://www.jianshu.com/p/aa09fe0594ef.html.
[3] jgroup. 俯瞰开源工作流引擎 Activiti [EB/OL].(2018-08-27).https://blog.csdn.net/jgroup/article/details/82116523.html.