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的子类,,,也就是归属于执行实例。。。流程实例是代表一个流程定义的特定的执行实例,,通俗的讲,启动了一个流程,就是创建了一个流程实例

执行实例:是流程实例中一条执行路径,他既可以表示流程实例本身,也可以表示流程中的具体节点,,如果是并行网关的情况下,一个流程实例可能会同时有多个执行实例


  1. 部署BPMN的xml文件,,会在act_re_deployment这个表里面有一个部署记录,,act_ge_bytearray:这个表会存放你上传的xml文件的byte,引擎会根据你的xml生成这个流程的显示图片,,act_re_procdef:这里面记录了流程定义的信息,,一次部署可能对应多个流程定义
java 复制代码
   @Test
    public 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());
    }

打印最新的流程定义:

java 复制代码
  private static final Logger logger = LoggerFactory.getLogger(Test02.class);
    @Test
    public 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去找:

java 复制代码
  @Test
    public 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());
        }
    }

根据流程部署去找对应的流程定义:

java 复制代码
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());
            }

        }
    }

删除流程部署: 删除流程部署之后,,涉及到流程定义的表,,都会被删除

java 复制代码
    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中添加一条任务数据

发起流程:

java 复制代码
   @Test
    public 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表中是找不到的:

java 复制代码
    @Test
    public void test02(){
        RuntimeService runtimeService = processEngine.getRuntimeService();

        // 如果流程不存在,,说明结束,,,如果存在,说明流程正在执行
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("xxx").singleResult();

    }

查看指定人的任务:

java 复制代码
    @Test
    public 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 :

java 复制代码
 @Test
    public 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);
            }
        }
    }

删除流程:

java 复制代码
    @Test
    public 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 这个表中

获取全局变量:

java 复制代码
  @Test
    public 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());
        }
    }
相关推荐
员大头硬花生2 小时前
七、InnoDB引擎-架构-后台线程
java·数据库·mysql
excel2 小时前
深度解析:Vue <script setup> 中的 defineModel 处理逻辑源码剖析
前端
excel2 小时前
🧩 深入理解 Vue 宏编译:processDefineOptions() 源码解析
前端
excel2 小时前
Vue 宏编译源码深度解析:processDefineProps 全流程解读
前端
excel2 小时前
Vue SFC 编译器源码深度解析:processDefineEmits 与运行时事件生成机制
前端
excel2 小时前
Vue 3 深度解析:defineModel() 与 defineProps() 的区别与底层机制
前端
excel2 小时前
深入解析 processDefineExpose:Vue SFC 编译阶段的辅助函数
前端
dcloud_jibinbin2 小时前
【uniapp】小程序体积优化,分包异步化
前端·vue.js·webpack·性能优化·微信小程序·uni-app
桜吹雪2 小时前
自定义instanceof运算符行为API: Symbol.hasInstance
前端