Activiti工作流
一、介绍
Activity是Tom Bayen(jBPM创始人)自2010年离开jBoss加入Alfresco公司后的又一力作:第一版在2010年5月发布,当时仅支持最简单的流程处理,之后的版本陆续完善了对BPMN 2.0规范的支持。其核心是使用Java开发的。其前身就是JBPM。
二、核心表
表 | 功能 |
---|---|
ACT_RE_* | 'RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。 |
ACT_RU_* | 'RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。 |
ACT_ID_* | 'ID’表示identity。 这些表包含身份信息,比如用户,组等等。 |
ACT_HI_* | 'HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。 |
ACT_GE_* | 通用数据, 用于不同场景下,如存放资源文件。 |
三、Service服务接口
Activiti中还有许多的Service服务接口。这些Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口,我们可以使用这些接口操作服务对应的数据表。
Service总览
Service名称 | 作用 |
---|---|
RepositoryService | Activiti的资源管理类 |
RuntimeService | Activiti的流程运行管理类 |
TaskService | Activiti的任务管理类 |
HistoryService | Activiti的历史管理类 |
ManagementService | Activiti的引擎管理类 |
RepositoryService: Activiti 的资源管理类,提供了管理和控制流程发布包和流程定义的操作。
RuntimeService: Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息。
Taskservice: Activiti的任务管理类。可以从这个类中获取任务的信息。
Historyservice: Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者,完成任务的时间,每个流程实例的执行路径,等等。这个服务主要通过查询功能来获得这些数据。
ManagementService: Activiti的引擎管理类,提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti 系统的日常维护。
四、BPMN插件
使用IDEA进行开发,建议下载一个插件。actiBPM插件,直接搜索下载。
五、流程操作
1、部署操作
使用 Activiti 提供的 API 把流程图的内容写入到数据库中
部署操作表:act_re_deployment、act_re_procdef、act_ge_bytearray
/**
* 流程部署
*/
public void deployment() {
// 创建 ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 使用 service 进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
Deployment deployment = repositoryService.createDeployment()
.name("出差申请流程") //流程图标的名字
.addClasspathResource("bpmn/evection.bpmn") //bpmn文件
.addClasspathResource("bpmn/evection.png") //bpmn文件生成的图片
.deploy();
// 输出部署信息
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署名字:" + deployment.getName());
}
2、启动流程实例
流程部署完成以后,需要启动流程实例。使用 RuntimeService 根据流程定义的 key进行启动。
/**
* 启动流程
*/
public void starProcess() {
// 创建 ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取 RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 根据流程定义的ID启动流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("myEvection");
// 输出内容
System.out.println("流程定义ID:" + instance.getProcessDefinitionId());
System.out.println("流程实例的ID:" + instance.getId());
System.out.println("当前活动的ID:" + instance.getActivityId());
}
3、任务查询
使用 TaskService ,根据流程定义的 key ,任务负责人来进行查询
/**
* 查询个人待执行的任务
*/
@Test
public void findPersonalTaskList() {
// 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取TaskService
TaskService taskService = processEngine.getTaskService();
// 根据流程的key和任务的负责人去查询任务
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("myEvection") // 流程的key
.includeProcessVariables()
.taskAssignee("zhangsan") // 要查询的负责人
.list();
// 输出
for (Task task : taskList) {
System.out.println("流程实例的ID:" + task.getProcessInstanceId());
System.out.println("任务的ID:" + task.getId());
System.out.println("任务的负责人:" + task.getAssignee());
System.out.println("任务的名称:" + task.getName());
}
}
4、任务完成
使用 TaskService ,用任务 ID 直接完成任务。
/**
* 完成个人任务
*/
@Test
public void completTask() {
String key = "testCandidiate";
String assignee = "张三1"; //任务的负责人
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee)
.singleResult();
if (task != null) {
taskService.complete(task.getId());
}
}
六、Activity优缺点
优点
1、 最大的优点就是免费开源,这也是很多人选择的原因
2、 小项目中应用简单的串行并行流转基本能满足需求。
缺点
1、节点定义概念不同
2、缺乏可“追溯”性
3、扩展需要与很多的Event来实现
4、二次开发难度大,门槛高