,当创建了流程引擎实例后,在ProcessEngine中会初始化一系列接口实例,这些接口实例提供了大部分操作流程引擎数据的业务方法,可以使用ProcessEngine中的getXXXService方法得到这些接口的实例。接口实例具体信息如图2所示。
3.2 编写Activiti程序
既然这是一个框架,自然就是引进jar包,画流程图,然后实现该框架提供的接口来做我们想要做的事情。
前期环境配置工作包括3步:Eclipse插件安装、IDEA插件安装、Activiti安装。一系列的环境准备工作结束,就可以编写Activiti程序。
Activiti框架会帮我们把对应的数据库表创建起来,它关联的数据库表有23个,不同的表头代表不同的用途,对应Service的不同API。
3.2.1 定义工作流
新建一个含有二级审核的工作流程,在每一步任务中,我们都可以指定对应的处理人是谁。流程图如图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 create Deployment()//创建一个部署的构建器
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()://创建一个任务查询对象
TaskQuerytaskQuery=taskService.createTaskQuery()://办理人的任务列表
Listlist=taskQuery.taskAssignee(assignee)//指定办理人
.list()://遍历任务列表
if(list!=null&&list.size()>0){
for(Tasktask;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无法满足这样的项目需求,就需