流程理解
网关
互斥网关 - 判断某条路径为True则执行
并行网关 - 全部为True则执行
相容网关 - 满足条件的全部执行,无论数量
配置文件
activiti.cfg.xml
Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数
数据库
Activiti后台数据库
所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。
ACT_ RE_* : ‘ RE ’ 表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。
ACT_ RU_* : ‘ RU ’ 表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ ID_* : ‘ ID ’ 表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_ HI_* : ‘ HI ’ 表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等等。
ACT_ GE_* : 通用数据,用于不同场景下,如存放资源文件。
表分类 | 表名 | 解释 | 详情 |
---|---|---|---|
一般数据 | |||
[ACT_GE_BYTEARRAY] | 通用的流程定义和流程资源 | 保存流程的bpmn的xml以及流程的lmage缩略图等信息 | |
[ACT_GE_PROPERTY] | 系统相关属性 | Flowable相关的基本信息。例如各个modue使用的版本信息 | |
流程历史记录 | |||
[ACT_HI_ACTINST] | 历史的流程实例 | ||
[ACT_HI_ATTACHMENT] | 历史的流程附件 | 实例的历史附件,几乎不会使用,会加大数据库很大的一个 | |
[ACT_HI_COMMENT] | 历史的说明性信息 | 备注 | |
[ACT_HI_DETAIL] | 历史的流程运行中的细节信息 | 详情 | |
[ACT_HI_IDENTITYLINK] | 历史的流程运行过程中用户关系 | 实例节点中,如果指定了目标人,产生的历史 | |
[ACT_HI_PROCINST] | 历史的流程实例 | ||
[ACT_HI_TASKINST] | 历史的任务实例 | ||
[ACT_HI_VARINST] | 历史的流程运行中的变量信息 | ||
流程定义表 | |||
[ACT_RE_DEPLOYMENT] | 部署单元信息 | 部署对象,存储流程名称 | |
[ACT_RE_MODEL] | 模型信息 | 基于流程的模型信息 | |
[ACT_RE_PROCDEF] | 已部署的流程定义 | ||
运行实例表 | |||
[ACT_RU_ACTINST] | 运行时实例表 | 运行中实例的活动表 | |
[ACT_RU_DEADLETTER_JOB] | 当JOB执行很多次都无法执行,就会被记录在此表 | ||
[ACT_RU_ENTITYLINK] | 还没使用到。后续更新此表 | ||
[ACT_RU_EVENT_SUBSCR] | 运行时事件 | ||
[ACT_RU_EXECUTION] | 运行时流程执行实例 | ||
[ACT_RU_HISTORY_JOB] | 运行中定时任务历史表 | ||
[ACT_RU_IDENTITYLINK] | 运行时用户关系信息,存储任务节点与参与者的相关信息 | ||
[ACT_RU_JOB] | 运行时作业 | 运行中的异步任务 | |
[ACT_RU_SUSPENDED_JOB] | 暂停的任务表 | 如果一个异步任务在运行中被暂停,就会记录在词表 | |
[ACT_RU_TASK] | 运行时任务 | 运行中的正常节点任务 | |
[ACT_RU_TIMER_JOB] | 定时作业表 | ||
[ACT_RU_VARIABLE] | 运行时变量表 | 运行中的流程实例变量 | |
组织信息 | |||
[ACT_ID_BYTEARRAY] | |||
[ACT_ID_GROUP] | 用户组信息 | ||
[ACT_ID_INFO] | 用户详情 | ||
[ACT_ID_MEMBERSHIP] | 用户组和用户的关系 | ||
[ACT_ID_PRIV] | 权限 | ||
[ACT_ID_PRIV_MAPPING] | 用户组和权限之间的关系 | ||
[ACT_ID_PROPERTY] | 用户或者用户组属性拓展表 | ||
[ACT_ID_TOKEN] | 登录相关日志 | ||
[ACT_ID_USER] | 用户 |
Flowable后台数据库
FLW_*. 未找到官方描述
表分类 | 表名 | 解释 | 详情 |
---|---|---|---|
[FLW_CHANNEL_DEFINITION] | 泳池管道定义表 | 保存流程的bpmn的xml以及流程的lmage缩略图等信息 | |
[FLW_EVENT_DEFINITION] | 事件定义 | ||
[FLW_EVENT_DEPLOYMENT] | 事件必输 | ||
[FLW_EVENT_RESOURCE] | 事件所需资源 | ||
[FLW_EV_DATABASECHANGELOG] | Liquibase执行的记录 | ||
[FLW_EV_DATABASECHANGELOGLOCK] | Liquibase执行锁 | ||
[FLW_RU_BATCH] | 暂时未知 | ||
[FLW_RU_BATCH_PART] | 暂时未知 |
接口API
Activiti常用接口API
ProcessEngineConfiguration
创建spring与activiti的整合配置文件
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
ProcessEngine
Activity工作流引擎,Activiti工作的核心,负责生成流程运行时的各种实例及数据、监控和管理流程的运行。所有的操作都是从获取引擎开始的,所以一般会把引擎作为全局变量
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
//创建完成后可随时获取
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService - 资源管理类
activiti的资源管理类,提供管理和控制流程发布包和流程定义的操作。使用业务流程图需要使用此service将流程定义文件的内容部署到计算机。
除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService - 流程运行管理类
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService - 任务管理类
TaskService taskService = processEngine.getTaskService();
HistoryService - 历史管理类
可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
ManagerService - 引擎管理类
提供对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。
代码示例
查询当前个人待执行的任务
@Test
public void testFindPersonalTaskList() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//创建TaskService
TaskService taskService = processEngine.getTaskService();
//根据流程key 和 任务负责人 查询任务
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey(DefinitionKey) //流程Key
.taskAssignee(assigneeName)//只查询该任务负责人的任务
.list();
for (Task task : list) {
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
完成任务
// 完成任务
taskService.complete(task.getId());
查询流程定义
@Test
public void queryProcessDefinition(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 得到ProcessDefinitionQuery 对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection")
.orderByProcessDefinitionVersion()
.desc()
.list();
// 输出流程定义信息
for (ProcessDefinition processDefinition : definitionList) {
System.out.println("流程定义 id="+processDefinition.getId());
System.out.println("流程定义 name="+processDefinition.getName());
System.out.println("流程定义 key="+processDefinition.getKey());
System.out.println("流程定义 Version="+processDefinition.getVersion());
System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
}
}
删除流程
使用repositoryService删除流程定义,历史表信息不会被删除
-
如果该流程定义下没有正在运行的流程,则可以用普通删除。
-
如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关记录全部删除。
先删除没有完成流程节点,最后就可以完全删除流程定义信息
public void deleteDeployment() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
//repositoryService.deleteDeployment(deploymentId, true);
}
查看历史信息
@Test
public void findHistoryInfo(){
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取HistoryService
HistoryService historyService = processEngine.getHistoryService();
//获取 actinst表的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//查询 actinst表,条件:根据 InstanceId 查询
//instanceQuery.processInstanceId("2501");
//查询 actinst表,条件:根据 DefinitionId 查询
instanceQuery.processDefinitionId(DefinitionId );
//增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//查询所有内容
List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
//输出
for (HistoricActivityInstance hi : activityInstanceList) {
System.out.println(hi.getActivityId());
System.out.println(hi.getActivityName());
System.out.println(hi.getProcessDefinitionId());
System.out.println(hi.getProcessInstanceId());
}
}
流程资源下载
通过流程定义对象获取流程定义资源,获取bpmn和png
public void queryBpmnFile() throws IOException {
// 1、得到引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(processDefinitionKey)
.singleResult();
// 4、通过流程定义信息,得到部署ID
String deploymentId = processDefinition.getDeploymentId();
// 5、通过repositoryService的方法,实现读取图片信息和bpmn信息
// png图片的流
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
// bpmn文件的流
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
// 6、构造OutputStream流
File file_png = new File("filePath");
File file_bpmn = new File("filePath");
FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);
FileOutputStream pngOut = new FileOutputStream(file_png);
// 7、输入流,输出流的转换
IOUtils.copy(pngInput,pngOut);
IOUtils.copy(bpmnInput,bpmnOut);
// 8、关闭流
pngOut.close();
bpmnOut.close();
pngInput.close();
bpmnInput.close();
}
Flowable常用接口API
FormService
表单数据的管理
//获取表单key
formService.getStartFormKey()
//查询表单json(无数据)
formService.getRenderedStartForm()
RepositoryService
提供了在编辑和发布审批流程的api,主要是模型管理和流程定义的业务api
//1.提供了带条件的查询模型流程定义的api
repositoryService.createXXXQuery()
//例如:
repositoryService.createModelQuery().list() //模型查询
repositoryService.createProcessDefinitionQuery().list() //流程定义查询
repositoryService.createXXXXQuery().XXXKey(XXX) //(查询该key是否存在)
//2.提供一大波模型与流程定义的通用方法
//模型相关
repositoryService.getModel() //(获取模型)
repositoryService.saveModel() //(保存模型)
repositoryService.deleteModel() //(删除模型)
repositoryService.createDeployment().deploy(); //(部署模型)
repositoryService.getModelEditorSource() //(获得模型JSON数据的UTF8字符串)
repositoryService.getModelEditorSourceExtra() //(获取PNG格式图像)
//3.流程定义相关
repositoryService.getProcessDefinition(ProcessDefinitionId); //获取流程定义具体信息
repositoryService.activateProcessDefinitionById() //激活流程定义
repositoryService.suspendProcessDefinitionById() //挂起流程定义
repositoryService.deleteDeployment() //删除流程定义
repositoryService.getProcessDiagram() //获取流程定义图片流
repositoryService.getResourceAsStream() //获取流程定义xml流
repositoryService.getBpmnModel(pde.getId()) //获取bpmn对象(当前进行到的那个节点的流程图使用)
//4.流程定义授权相关
repositoryService.getIdentityLinksForProcessDefinition() //流程定义授权列表
repositoryService.addCandidateStarterGroup()//新增组流程授权
repositoryService.addCandidateStarterUser() //新增用户流程授权
repositoryService.deleteCandidateStarterGroup() //删除组流程授权
repositoryService.deleteCandidateStarterUser() //删除用户流程授权
RuntimeService
处理正在运行的流程
runtimeService.createProcessInstanceBuilder().start() //发起流程
runtimeService.deleteProcessInstance() //删除正在运行的流程
runtimeService.suspendProcessInstanceById() //挂起流程定义
runtimeService.activateProcessInstanceById() //激活流程实例
runtimeService.getVariables(processInstanceId); //获取表单中填写的值
runtimeService.getActiveActivityIds(processInstanceId) //获取以进行的流程图节点 (当前进行到的那个节点的流程图使用)
runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, endId).changeState(); //终止流程
HistoryService
处理流程实例的API(用户发起审批后生成流程实例),包括已完成和未完成的实例
注意:处理正在运行的流程实例,使用runtimeService
historyService.createHistoricProcessInstanceQuery().list() //查询流程实例列表(历史流程,包括未完成的)
historyService.createHistoricProcessInstanceQuery().list().foreach().getValue() //可以获取历史中表单的信息
historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); //根绝id查询流程实例
historyService.deleteHistoricProcessInstance() //删除历史流程
historyService.deleteHistoricTaskInstance(taskid); //删除任务实例
historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).list() //流程实例节点列表 (当前进行到的那个节点的流程图使用)
TaskService
对流程实例各个节点审批处理
//流转的节点审批
taskService.createTaskQuery().list() //待办任务列表
taskService.createTaskQuery().taskId(taskId).singleResult(); //待办任务详情
taskService.saveTask(task); //修改任务
taskService.setAssignee() //设置审批人
taskService.addComment() //设置审批备注
taskService.complete() //完成当前审批
taskService.getProcessInstanceComments(processInstanceId); //查看任务详情(也就是都经过哪些人的审批,意见是什么)
taskService.delegateTask(taskId, delegater); //委派任务
taskService.claim(taskId, userId); //认领任务
taskService.unclaim(taskId); //取消认领
taskService.complete(taskId, completeVariables); //完成任务
//任务授权
taskService.addGroupIdentityLink() //新增组任务授权
taskService.addUserIdentityLink() //新增人员任务授权
taskService.deleteGroupIdentityLink() //删除组任务授权
taskService.deleteUserIdentityLink() //删除人员任务授权
ManagementService
执行自定义命令
managementService.executeCommand(new classA()) //执行classA的内部方法
//自定义方法中,获取repositoryService
ProcessEngineConfiguration processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();
//自定义方法中,获取流程定义方法集合
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
ProcessDefinitionEntityManager processDefinitionEntityManager = processEngineConfiguration.getProcessDefinitionEntityManager();
//例如findById/findLatestProcessDefinitionByKey/findLatestProcessDefinitionByKeyAndTenantId等。
IdentityService
用于身份信息获取和保存
identityService.createUserQuery().userId(userId).singleResult(); //获取审批用户的具体信息
identityService.createGroupQuery().groupId(groupId).singleResult(); //获取审批组的具体信息
流程图片为个人绘图,内容为多文章综合
Flowable相关引用来自 http://t.csdnimg.cn/p27Xy