之前项目用到过Activiti,一直没有深入了解过,面试被问到几次,现在抽时间研究研究。
1. 数据库表
28张表
act_evt_log:事件表(event)-EventLogEntry
act_ge前缀:通用表(general)
act_hi前缀:历史表(history)-HistoryService
act_id前缀:身份表(identity)-IdentityService
act_procdef_info:流程定义(processDefinition)
act_re前缀:储存表(repository)-RepositoryService
act_ru前缀:运行表(runtime)-RuntimeService
2. 底层ORM框架
框架:mybatis
mapping:xml文件路径:org.activiti.db.mapping.entity
建表语句:org.activiti.db.create
DA方式:与我们常用的面向接口编程方式不同,底层不使用Dao接口与Mapper绑定,而是使用SqlSession相关方法,直接调用xml文件内的SQL语句。例如:this.getDbSqlSession().selectList(“selectTaskByQueryCriteria”, taskQuery);
this.sqlSession.selectList(statement, parameter);
3. 流程图定义
idea安装actiBPM插件或者使用其他BPM绘图软件绘制流程图。
activiti-bpmn-layout依赖可以代码生成BPMN文件
4. 流程部署
Deployment deploy = repositoryService.createDeployment()
.name("apply vacation")
.key("vacation")
.addClasspathResource("processes/vacation.bpmn20.xml")
.deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.deploymentId(deploy.getId())
.singleResult();
createDeployment()会在act_re_deployment表新增一条数据,
createProcessDefinitionQuery会在act_re_procdef表新增一条数据
5. 流程启动
Map<String, Object> map = new HashMap<>();
map.put("days", apply.getDays());
map.put("manager", user.getId());
map.put("managerTaskListener", new ManagerTaskListener());
ProcessInstance p = runtimeService.startProcessInstanceById(vacation.getProcdefId(), map);
通过流程定义ID启动,得到流程实例ID,同时可以设置启动的相关参数
6. 任务操作
// 取任务
Task task = taskService.createTaskQuery()
.taskAssignee(userId.toString())
.processInstanceId(pId)
.singleResult();
if (task == null) {
return "任务不存在";
}
taskService.setVariable(task.getId(), "任务变量", "hello");
taskService.setVariable(task.getId(), "任务变量", "hello2");
taskService.setVariableLocal(task.getId(), "任务变量", "hello3");
taskService.setAssignee(task.getId(), "1000");
taskService.complete(task.getId());
7. 删除流程
runtimeService.deleteProcessInstance(task.getProcessInstanceId(), "不通过");
8. Listener
任务可以配置监听器,设置监听事件,比如设置create监听事件,任务创建时触发,需要实现TaskListener接口,并作为参数传递到流程中
9. 变量
setVariable设置的是流程实例级别的变量,随着流程一起存在;
setVariableLocal属于本地变量,对于没有子流程的流程和setVariable一样,对于task来说当task完成,local变量会随之消失
10. 其他
流程图可以使用${}表达式来赋值,流程中的参数会进入流程判断,控制流程走向。