Flowable进阶学习(二)流程部署的深入解析

一、流程部署涉及表及其结构

1. 部署流程代码示例:

  1. 设计俩个流程,并压缩成zip包。
    在这里插入图片描述
  2. 代码:
    package com.hx;
    
    import org.flowable.engine.*;
    import org.flowable.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration;
    import org.flowable.engine.repository.Deployment;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.InputStream;
    import java.util.zip.ZipInputStream;
    
    /**
     * @author Huathy
     * @date 2023-01-08 21:57
     * @description
     */
    public class Test4_ProcessDeploy {
        ProcessEngineConfiguration configuration = null;
        ProcessEngine processEngine = null;
        @Before
        public void before() {
            // 通过 ProcessEngineConfiguration 构建我们需要的 ProcessEngine
            configuration = new StandaloneInMemProcessEngineConfiguration();
            // 配置相关数据库连接
            configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");
            configuration.setJdbcUsername("root");
            configuration.setJdbcPassword("admin");
            configuration.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/flowable_learn?useSSL=false&serverTimezone=UTC");
            // 如果数据库中的表结构不存在则新建
            configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
            processEngine = configuration.buildProcessEngine();
        }
    
        /**
         * 流程部署:涉及到三张表
         *  流程部署表:ACT_RE_DEPLOYMENT一次流程部署操作就会产生一条记录
         *  流程定义表:ACT_RE_PROCDEF        一次流程部署操作中包含几个流程定义文件就会产生几条记录
         *  流程定义资源表:ACT_GE_BYTEARRAY   有多少资源就会产生几条记录
         */
        @Test
        public void test1_deploy(){
            RepositoryService repositoryService = processEngine.getRepositoryService();
            InputStream ins = this.getClass().getClassLoader().getResourceAsStream("holidayAndProcess.zip");
            ZipInputStream zipIns = new ZipInputStream(ins);
            // 流程部署操作,关联zip或者bar文件
            Deployment deploy = repositoryService.createDeployment()
    //                .addClasspathResource("MyProcess.bpmn20.xml")
                    .addZipInputStream(zipIns)
                    .name("请假流程")
                    .category("请假")     // 分类
                    .tenantId("whx")     // 租户ID
                    .deploy();
            System.out.println("deploy.getId() = " + deploy.getId());
            System.out.println("deploy.getName() = " + deploy.getName());
            System.out.println("deploy.getCategory() = " + deploy.getCategory());
        }
    }
    
  3. 测试运行结果
    在这里插入图片描述

2. 流程部署所涉及表:

查看表结构与数据变动(其中ACT_RE_DEPLOYMENT的一条记录可以对应ACT_RE_PROCDEF的多条记录)

  • 流程部署表:ACT_RE_DEPLOYMENT(一次流程部署操作就会产生一条记录)
    在这里插入图片描述
  • 流程定义表:ACT_RE_PROCDEF(一次流程部署操作中包含几个流程定义文件就会产生几条记录)
    ID_            |REV_|CATEGORY_                         |NAME_      |KEY_       |VERSION_|DEPLOYMENT_ID_|RESOURCE_NAME_        |DGRM_RESOURCE_NAME_        |DESCRIPTION_   |HAS_START_FORM_KEY_|HAS_GRAPHICAL_NOTATION_|SUSPENSION_STATE_|TENANT_ID_|ENGINE_VERSION_|DERIVED_FROM_|DERIVED_FROM_ROOT_|DERIVED_VERSION_|
    ---------------+----+----------------------------------+-----------+-----------+--------+--------------+----------------------+---------------------------+---------------+-------------------+-----------------------+-----------------+----------+---------------+-------------+------------------+----------------+
    MyHolidayUI:1:7|   1|http://www.flowable.org/processdef|MyHolidayUI|MyHolidayUI|       1|1             |MyHolidayUI.bpmn20.xml|MyHolidayUI.MyHolidayUI.png|MyHolidayUI请假流程|                  0|                      1|                1|whx       |               |             |                  |               0|
    MyProcess:1:6  |   1|http://www.flowable.org/processdef|MyProcess  |MyProcess  |       1|1             |MyProcess.bpmn20.xml  |MyProcess.MyProcess.png    |请假流程           |                  0|                      1|                1|whx       |               |             |                  |               0|
    
  • 流程定义资源表:ACT_GE_BYTEARRAY(有多少资源就会产生几条记录)
    在这里插入图片描述

3. 流程部署涉及表的结构、字段解析

  1. 流程部署表:ACT_RE_DEPLOYMENT
字段含义与注释
ID_主键
NAME_名称
CATEGORY_分类
KEY_
TENANT_ID_租户ID
DEPLOY_TIME_部署事件
DERIVED_FROM_来源于
DERIVED_FROM_ROOT_来源于
ENGINE_VERSION_引擎版本号

在这里插入图片描述
2. 流程定义表:ACT_RE_PROCDEF

NameValue
ID_自动生成的ID
REV_1
CATEGORY_流程定义的namespace
NAME_每个流程的名称
KEY_自己定义的ID
VERSION_1
DEPLOYMENT_ID_部署关联的ID
RESOURCE_NAME_资源名称
DGRM_RESOURCE_NAME_图片
DESCRIPTION_MyHolidayUI请假流程
HAS_START_FORM_KEY_0
HAS_GRAPHICAL_NOTATION_1
SUSPENSION_STATE_当前流程的状态,1正常,2挂起
TENANT_ID_租户ID。可关联用户。
ENGINE_VERSION_
DERIVED_FROM_
DERIVED_FROM_ROOT_
DERIVED_VERSION_0
  1. 部署资源表:ACT_GE_BYTEARRAY
字段含义及备注
ID_主键
REV_版本号
NAME_部署的文件名称(如MyProcess.bpmn20.xml)
DEPLOYMENT_ID_部署ID
BYTES_字节(二进制数据)
GENERATED_是否系统生成。
(0为用户上传,1为系统生成。比如系统会自动根据xml生成png文件)

二、流程部署中数据的存储的过程

// 我们一路跟踪代码的方法
// org.flowable.engine.repository.DeploymentBuilder#deploy
// org.flowable.engine.common.impl.interceptor.CommandExecutor#execute(org.flowable.engine.common.impl.interceptor.Command<T>)
// 进入 org.flowable.engine.impl.cmd.DeployCmd 类
// 看到执行器方法 org.flowable.engine.impl.cmd.DeployCmd#execute
// org.flowable.engine.impl.cmd.DeployCmd#executeDeploy
protected Deployment executeDeploy(CommandContext commandContext) {
// 获取 DeploymentEntity 对象,ProcessEngineConfigurationImpl 配置文件实现类,setDeploymentTime设置部署时间
   if (this.deploymentBuilder.isDuplicateFilterEnabled()) {
			// 是否有开启重复的流程的判断,若有则进行判断
   }
   deployment.setNew(true);
// Save the data 保存数据
  CommandContextUtil.getDeploymentEntityManager(commandContext).insert(deployment);
// Actually deploy 部署流程
  processEngineConfiguration.getDeploymentManager().deploy(deployment, deploymentSettings);
// 省略
   return deployment;
}

// 继续跟踪上面的insert方法 
// org.flowable.engine.impl.persistence.entity.DeploymentEntityManagerImpl#insert
@Override
public void insert(DeploymentEntity deployment) {
    // 插入部署信息
    insert(deployment, false);
		// 循环插入资源文件
    for (EngineResource resource : deployment.getResources().values()) {
        resource.setDeploymentId(deployment.getId());
        getResourceEntityManager().insert((ResourceEntity) resource);
    }
}

// 继续跟踪上面的deploy方法 
// org.flowable.engine.impl.persistence.deploy.DeploymentManager#deploy(org.flowable.engine.impl.persistence.entity.DeploymentEntity, java.util.Map<java.lang.String,java.lang.Object>)
public void deploy(DeploymentEntity deployment, Map<String, Object> deploymentSettings) {
   for (EngineDeployer deployer : deployers) {
       deployer.deploy(deployment, deploymentSettings);
   }
}
// 跟踪deployer.deploy
// org.flowable.engine.impl.bpmn.deployer.BpmnDeployer#deploy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huathy-雨落江南,浮生若梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值