Activiti6-API详解
# Activiti6-API详解
Activiti核心API主要包括8个:
- RepositoryService:提供流程部署和流程定义的操作方法,如流程定义的挂起、激活等
- RuntimeService:提供运行时流程实例的操作方法,如流程实例的发起、流程变量的设置等
- TaskService:提供运行时流程任务的操作方法,如任务的创建、办理、指派、认领和删除等
- HistoryService:提供历史流程数据的操作方法,如历史流程实例、历史变量、历史任务的查询等
- ManagementService:提供对工作流引擎进行管理和维护的方法,如数据库表数据、表元数据的查询和执行命令
- IdentityService:提供用户或者组的操作方法,如用户的增、删、改、查等
- FormService:提供流程表单的操作方法,如表单获取、表单保存等
- DynamicBpmnService:提供流程定义的动态修改方法,从而避免重新部署它。
接下来通过流程实例,一个一个的调用这些API,并观察调用之后数据表的变化
# 1、RepositoryService(存储服务)
存储服务主要提供4类操作:
- 流程部署的创建、删除、查询
- 流程定义的查询、挂起、激活
- 模型的新建、保存、删除
- 候选人、候选组的新增、删除、查询
# 1.1、流程模型保存
在UI界面调整模型后,点击保存,触发API
// 1、先调用newModel()创建新的模型对象
Model model = repositoryService.newModel();
// 2、给模型数据增加参数
model.setCategory(modelRequest.getCategory());
model.setKey(modelRequest.getKey());
ObjectNode modelNode = objectMapper.createObjectNode();
modelNode.put(ModelDataJsonConstants.MODEL_NAME, modelRequest.getName());
modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, modelRequest.getDescription());
modelNode.put(ModelDataJsonConstants.MODEL_REVISION, modelRequest.getVersion());
model.setMetaInfo(modelNode.toString());
model.setName(modelRequest.getName());
model.setVersion(modelRequest.getVersion());
// 3、调用saveModel保存模型
repositoryService.saveModel(model);
// 4、调用addModelEditorSource保存模型文件
repositoryService.addModelEditorSource(model.getId(), objectMapper.writeValueAsBytes(content));
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
保存过后,涉及到的表 act_re_model、act_ge_bytearray
# 1.2、流程部署
流程只有部署之后才能使用
// 1、通过模型ID进行部署,先查询模型信息
Model model = repositoryService.getModel(modelId);
byte[] modelData = repositoryService.getModelEditorSource(modelId);
//2、调用部署流程API createDeployment
BpmnModel bpmnModel = (new BpmnJsonConverter()).convertToBpmnModel(jsonNode);
Deployment deploy = repositoryService.createDeployment().category(model.getCategory())
.name(model.getName()).key(model.getKey())
.addBpmnModel(model.getKey() + ".bpmn20.xml", bpmnModel)
.deploy();
// 3、把部署ID同步写回模型表
model.setDeploymentId(deploy.getId());
repositoryService.saveModel(model);
2
3
4
5
6
7
8
9
10
11
12
部署过后,涉及到的表 act_re_deployment,act_re_procdef
# 1.3、流程挂起
repositoryService.suspendProcessDefinitionById("");
涉及的表act_re_procdef,其中字段SUSPENSION_STATE_(流程挂起状态)会修改为true
# 1.4、流程激活
流程激活可以取消挂起,可以通过ID或者key来激活流程
// 通过流程ID激活
repositoryService.activateProcessDefinitionById("");
2
流程激活之后,会涉及到act_re_procdef
# 2、RuntimeService(运行时服务)
运行时服务主要提供6类操作:
- 创建和发起流程实例
- 唤醒等待状态的流程实例
- 流程权限的管理,主要是流程实例和人员之间的关系管理
- 流程变量的管理,变量的新增、删除、查询
- 管理运行时流程实例、执行实例
- 信号、消息事件的发布与接收,以及事件监听器的管理
# 2.1、流程发起
// 多种发起流程实例的API,大致分为ID、KEY、消息等直接发起流程
// 通过流程KEY启动
runtimeService.startProcessInstanceByKey("leave", String.valueOf(leaveapply.getId()), variables);
2
3
启动之后,涉及多张表的数据流转:
act_ru_execution:运行时流程执行实例表,会增加两个数据,为主子数据
act_ru_identitylink:存储运行时的参数数据
其中,第一条流程实例ID 2506,代表这个流程实例是admin账户启动的。第二条数据,候选人是部门经理组织,说明下一个任务的执行人是属于部门经理组织下的人员
act_ru_task:任务表,代表下一个执行的任务,是直系领导审批节点
act_ru_variable:运行时参数,刚才启动流程加入了申请人和部门领导两个参数,所以这个表有两个数据
流程发起源码解读:
Activiti启动时做的操作:
1、缓存解析器
BpmnXMLConverter首次加载会先缓存各种类型的解析器,比如任务解析器、网关解析器等
2、初始化整个责任链 ProcessEngineConfigurationImpl
在项目启动时,ProcessEngineConfigurationImpl中的init()方法调用initCommandExecutor(),调用initInterceptorChain,会把所有的拦截器放入Chain中,然后抛出收节点first = chain.get(0), 最后new CommandExecutorImpl(getDefaultCommandConfig(), first),这样first就有了初始值,后续CommandExecutorImpl执行first.execute的时候就会按照调用链依次执行拦截器逻辑
3、业务源码解析时序图如下图所示:
# 2.2、流程审批
查询我的代办:
// 根据当前人信息查询任务表中办理人是自己的数据,就是我的代办
TaskQuery condition = taskService.createTaskQuery().taskAssignee(username);
// 过滤掉流程挂起的待办任务 .active()
int total = condition.active().orderByTaskCreateTime().desc().list().size();
int start = (param.getPageNum()-1) * param.getPageSize();
// 分页查询
List<Task> taskList = condition.active().orderByTaskCreateTime().desc().listPage(start, param.getPageSize());
2
3
4
5
6
7
办理流程:
// 将某个任务指定给某个人
taskService.setAssignee(taskId, username);
// 直接办理
taskService.complete(taskId);
// 或者根据参数进行办理
taskService.complete(taskId, variables);
2
3
4
5
6
办理之后涉及的表:
act_ru_task:任务表,代表下一个执行的任务,是部门领导审批节点
act_hi_comment:历史命令表,代表已经执行过的审核命令
act_hi_actinst:三条数据,代表已经执行的两个,和未执行的一个
act_hi_taskinst:历史任务实例表,当前表会插入两个数据,和actinst相比,没有开始节点的数据,这个表也是经常使用查询流程追踪历史的表
# 2.3、流程办理,走网关流程详解
1、跟开始节点的执行逻辑差不多,核心就是CommandInvoker一直循环执行里面的命令,执行完一个命令之后,判断下一个节点类型,压入对应的执行器,而具体的业务实现都是在xxxBehavior中
# 3、HistoryService(历史服务)
历史服务主要提供4类操作:
- 创建历史流程实例、历史活动实例、历史任务实例、历史详情、历史变量等对象的查询;
- 创建历史流程实例、历史活动实例、历史任务实例、历史详情、历史变量等对象的原生查询,支持传入SQL;
- 删除历史流程实例、历史任务实例
- 查询与历史流程实例、任务实例关联的用户
1、查询历史任务节点的API
historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId)
.activityType("userTask").orderByHistoricActivityInstanceStartTime().asc().list();
/*
list方法最终的查询时执行mybatis的查询逻辑,固定查询selectHistoricTaskInstancesByQueryCriteria方法
mybatis对应的xml文件目录在:activiti-engine-6.0.0.jar!\org\activiti\db\mapping\entity\HistoricTaskInstance.xml
*/
2
3
4
5
6
# 4、ManagementService(管理服务)
管理服务主要提供数据表和元数据的管理和查询服务
还提供查询和管理异步任务的功能(比如定时器、异步操作、延迟暂停、激活)
还可以直接执行某个CMD命令
# 4.1、查询所有数据表的数据条数
@Test
public void testManagement() {
Map<String, Long> tableCount = managementService.getTableCount();
for (Map.Entry<String, Long> stringLongEntry : tableCount.entrySet()) {
System.out.println(stringLongEntry.getKey() + " : " + stringLongEntry.getValue());
}
}
2
3
4
5
6
7
# 5、IdentityService(身份服务)
身份服务接口负责提供用户、组、和人员组织关系管理等
主要提供3类方法:
- 用户管理相关:新建用户、保存用户、查询、删除用户等
- 与组管理相关:增删改查 用户组
- 维护用户和用户组的关系
@Test
public void testUser() {
User u1 = identityService.newUser("zhaoyubo");
u1.setFirstName("zhao");
u1.setLastName("yubo");
u1.setEmail("zhaoyubo@163.com");
identityService.saveUser(u1);
Group leaderGroup = identityService.newGroup("leaderGroup");
leaderGroup.setName("领导组");
leaderGroup.setType("LEADER");
identityService.saveGroup(leaderGroup);
identityService.createMembership("zhaoyubo", "leaderGroup");
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 6、监听的执行顺序
执行监听器:可以在流程结束后发短信给某人
流程和节点有start和end事件2种事件。顺序流有start、end、take3种事件
start end take
任务监听器: 可以在流程流转到某个节点且需要某个用户处理时通知该用户 create 任务创建事件 assignment 任务指派事件 complete 任务完成事件 delete 任务删除事件
把所有事件都配置一遍,然后执行流程,观察监听的执行顺序
StartListener
AssignmentListener
CreateListener
CompleteListener
DeleteListener
EndListener
StartListener
TakeListener
EndListener
2
3
4
5
6
7
8
9
10
全局事件监听器