flowable使用01
流程部署
act_re_repository : 部署记录表
每一次部署都会生成一条部署记录
- name_ : 部署的名字
- category_ : 分类
- deploy_time_ : 部署时间
act_re_procdef : 流程定义表
存储了流程定义,,, 一次部署可能会部署多个BPMN文件,,也就有多个流程定义
- category_ : 分类,来自部署的类别
- name_ : 流程定义的名字(BPMN文件中的name)
- key_ : 流程的唯一键 (BPMN文件中的id)
- version : 版本号,, 当部署相同的key的BPMN文件时,,版本号回自增1
- deployment_id : 关联
act_re_deployment表的id,,表名这个流程来自于那一次部署 - resource_name : 对应
act_ge_bytearray,存放BPMN的xml的name_ 字段 - dgrm_resource_name : 对应
act_ge_bytearray表中存放流程图片文件的name_字段
act_ge_bytearray : 资源文件表
ge: general
用来存储所有的二进制文件
- name_ : 资源的原始文件名字
- deployment_id : 关联的部署id
- bytes : 文件的二进制内容
- generated : 标识是引擎自己生成的,还是用户上传的
流程部署: 是每一次的部署记录,,一次可以部署多个流程定义,,,
流程定义: 用来描述流程是什么,,同样的一个key的流程定义,,部署多次的话,version会自增
流程实例:相当于用户启动的一个流程,,, 这个是Execution的子类,,,也就是归属于执行实例。。。流程实例是代表一个流程定义的特定的执行实例,,通俗的讲,启动了一个流程,就是创建了一个流程实例
执行实例:是流程实例中一条执行路径,他既可以表示流程实例本身,也可以表示流程中的具体节点,,如果是并行网关的情况下,一个流程实例可能会同时有多个执行实例
- 部署
BPMN的xml文件,,会在act_re_deployment这个表里面有一个部署记录,,act_ge_bytearray:这个表会存放你上传的xml文件的byte,引擎会根据你的xml生成这个流程的显示图片,,act_re_procdef:这里面记录了流程定义的信息,,一次部署可能对应多个流程定义
@Testpublic void test(){RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deployment = repositoryService.createDeployment().name("请假").key("leave").category("请假分类").addClasspathResource("ask_for_leave.bpmn20.xml").deploy();System.out.println("deployment.getId() = " + deployment.getId());}
打印最新的流程定义:
private static final Logger logger = LoggerFactory.getLogger(Test02.class);@Testpublic void test02(){RepositoryService repositoryService = processEngine.getRepositoryService();List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()// 最后一个版本的.latestVersion().list();for (ProcessDefinition pd : list) {logger.info("id:{},name:{},version:{},category:{}",pd.getId(),pd.getName(),pd.getVersion(),pd.getCategory());}}
根据指定的key去找流程定义,,,也就是根据指定xml的id去找:
@Testpublic void test02(){RepositoryService repositoryService = processEngine.getRepositoryService();List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()// 根据xml中的id 去找.processDefinitionKey("ask_for_leave")// 按照版本号排序.orderByProcessDefinitionKey().desc() // 这个desc好像没什么用.list();for (ProcessDefinition pd : list) {logger.info("id:{},name:{},version:{},category:{}",pd.getId(),pd.getName(),pd.getVersion(),pd.getCategory());}}
根据流程部署去找对应的流程定义:
public void test03(){RepositoryService repositoryService = processEngine.getRepositoryService();List<Deployment> list = repositoryService.createDeploymentQuery().list();for (Deployment d : list) {List<ProcessDefinition> pdList = repositoryService.createProcessDefinitionQuery().deploymentId(d.getId()).list();for (ProcessDefinition pd : pdList) {logger.info("id:{},name:{},version:{},category:{}",pd.getId(),pd.getName(),pd.getVersion(),pd.getCategory());}}}
删除流程部署: 删除流程部署之后,,涉及到流程定义的表,,都会被删除
RepositoryService repositoryService = processEngine.getRepositoryService();List<Deployment> list = repositoryService.createDeploymentQuery().list();for (Deployment deployment : list) {repositoryService.deleteDeployment(deployment.getId());}
流程实例 ProcessInstance
和执行实例的区别,, 流程实例也算一个执行实例,只不过他是流程的根的执行实例,,
act_ru_execution : 执行实例表
当前所有运行中的执行实例,,,在流程实例运行过程中,,执行实例会表示当前的活跃节点(或分支)
- rev_ : 版本号: 用于乐观锁
- proc_inst_id : 对应的流程实例id
- business_key : 业务键 : 启动流程实例的时候传入
- parent_id : 父执行实例的id : 用于子流程
- act_id: 当前活动的id(当前流程实例,执行实例所在的节点)
- is_active : 是否活跃(表示这个执行实例是否正在执行)
- is_concurrent : 是否并发(用于并行网关产生的分支)
- is_scope : 是否作用域
act_ru_actinst : 运行时活动实例表
所有活动(节点) 的实例信息,,包含当前正在执行和已经执行完了的节点,,他记录了流程实例经过每一个节点的详细信息(包括:开始节点,用户任务,服务任务,网关,结束点 等)
- proc_def_id : 流程定义id
- proc_inst_id : 流程实例id
- execution_id : 执行实例id
- act_id : 活动id(BPMN文件中每一个节点都会有的那个id)
- act_name: 活动名称
- act_type : 活动类型(userTask,startEvent,endEvent 等)
- start_time : 活动开始时间
- end_time : 活动结束时间
- duration : 活动持续时间
act_ru_task : 运行时任务表
流程到达了一个用户任务,,就会在这个表中创建一条记录,当任务完成时,这个记录就消失了
- name : 任务名称
- parent_task_id : 父任务id(如果存在子任务的话)
- description: 任务描述
- priority : 任务优先级
- create_time : 任务创建时间
- assignee : 任务指派给谁
- proc_inst_id : 流程实例id
- execution_id : 执行实例id
- task_def_key : 任务定义的key(也就是BPMN中用户任务的id)
发起一个流程,,首先会在act_ru_execution这个表中创建执行实例,,一般会有两个,一个是根执行实例,,一个是正在执行的执行实例,,,,
如果当前节点是 用户任务,就会在act_ru_task中添加一条任务数据
发起流程:
@Testpublic void test(){RuntimeService runtimeService = processEngine.getRuntimeService();String processDefinitionKey = "ask_for_leave";ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinitionKey);logger.info("definitionId:{},id:{},name:{}", pi.getProcessDefinitionId(), pi.getId(), pi.getName());}
判断流程是否执行结束了:
如果流程执行结束了,在ru表中是找不到的:
@Testpublic void test02(){RuntimeService runtimeService = processEngine.getRuntimeService();// 如果流程不存在,,说明结束,,,如果存在,说明流程正在执行ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("xxx").singleResult();}
查看指定人的任务:
@Testpublic void test01(){TaskService taskService = processEngine.getTaskService();List<Task> taskList = taskService.createTaskQuery().taskAssignee("cc").list();for (Task task : taskList) {logger.info("id:{},assignee:{},name:{}",task.getId(),task.getAssignee(),task.getName());}}
查看当前处于的活动id :
@Testpublic void test03(){RuntimeService runtimeService = processEngine.getRuntimeService();List<Execution> list = runtimeService.createExecutionQuery().list();for (Execution execution : list) {// 当前执行实例 活动的节点List<String> activeActivityIds = runtimeService.getActiveActivityIds(execution.getId());System.out.println(activeActivityIds.size());for (String activeActivityId : activeActivityIds) {logger.info("activeActivityId:{}", activeActivityId);}}}
删除流程:
@Testpublic void test06(){RuntimeService runtimeService = processEngine.getRuntimeService();List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().list();for (ProcessInstance processInstance : list) {String deleteReason = "想删除";runtimeService.deleteProcessInstance(processInstance.getId(),deleteReason);}}
还有挂起流程,恢复挂起,,这种一般用于,,系统出现规则漏洞,,或者系统定期维护,,员工离职审计,,,通过脚本或者管理后台挂起全系统的所有的流程实例,,等到维护结束,在批量激活
DataObject
全局变量

这里配置全局变量,,全局变量是跟流程关联,,

全局变量会被存放在act_ru_variable 这个表中
获取全局变量:
@Testpublic void test08(){RuntimeService runtimeService = processEngine.getRuntimeService();ProcessInstance processInstance = runtimeService.startProcessInstanceById("ask_for_leave:3:10004");Map<String, DataObject> dataObjects = runtimeService.getDataObjects(processInstance.getId());for (String s : dataObjects.keySet()) {DataObject data = dataObjects.get(s);logger.info("id:{},name:{},value:{},type:{}",data.getId(),data.getName(),data.getValue(),data.getType());}}
