activiti创建数据表源码解析

Activiti重复建表bug 文章目录故障码分析解决办法 故障码   故障码如下: 2019-11-11 16:05:27.318 INFO 19208 --- [ main] o.activiti.engine.impl.db.DbSqlSession : performing create on history with resource org/activiti/db/create/activi... 阅读详情

activiti创建数据表源码解析

     activiti7那段代码创建数据表的?从源码开始分析。

执行过程

      

ProcessEngineConfigurationImpl config = (ProcessEngineConfigurationImpl) ProcessEngineConfiguration
            .createProcessEngineConfigurationFromResource("org/activiti/engine/test/db/connection-mysql-pool.activiti.cfg.xml");

        config.buildProcessEngine();

 

初始化流程引擎,后台使用Mysql数据库,配置文件如下

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
  
    <!-- Database configurations -->
<!--    <property name="databaseSchemaUpdate" value="true" />-->

    <property name="jdbcMaxActiveConnections" value="25" />
    <property name="jdbcMaxIdleConnections" value="10" />
    <property name="jdbcMaxCheckoutTime" value="30000" />
    <property name="jdbcMaxWaitTime" value="25000" />
    
    <!-- job executor configurations -->
    <property name="asyncExecutorActivate" value="false" />

    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti_7?serverTimezone=UTC" />
    <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" />
    <property name="jdbcUsername" value="root" />
    <property name="jdbcPassword" value="shootercheng" />

    <!-- Database configurations -->
    <property name="databaseSchemaUpdate" value="drop-create" />
    
  </bean>

</beans>
public ProcessEngine buildProcessEngine() {
    init();
    ProcessEngineImpl processEngine = new ProcessEngineImpl(this);
    postProcessEngineInitialisation();

    return processEngine;
  }

创建数据库代码在  ProcessEngineImpl processEngine = new ProcessEngineImpl(this); 这一句里面执行

if (processEngineConfiguration.isUsingRelationalDatabase() && processEngineConfiguration.getDatabaseSchemaUpdate() != null) {
      commandExecutor.execute(processEngineConfiguration.getSchemaCommandConfig(), new SchemaOperationsProcessEngineBuild());
    }
public final class SchemaOperationsProcessEngineBuild implements Command<Object> {

  public Object execute(CommandContext commandContext) {
    DbSqlSession dbSqlSession = commandContext.getDbSqlSession();
    if (dbSqlSession != null) {
      dbSqlSession.performSchemaOperationsProcessEngineBuild();
    }
    return null;
  }
}

执行sql文件的类是  DbSqlSession.java

public void performSchemaOperationsProcessEngineBuild() {
        String databaseSchemaUpdate = Context.getProcessEngineConfiguration().getDatabaseSchemaUpdate();
        log.debug("Executing performSchemaOperationsProcessEngineBuild with setting " + databaseSchemaUpdate);
        if (ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_DROP_CREATE.equals(databaseSchemaUpdate)) {
            try {
                dbSchemaDrop();
            } catch (RuntimeException e) {
                // ignore
            }
        }
        if (org.activiti.engine.ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP.equals(databaseSchemaUpdate)
                || ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_DROP_CREATE.equals(databaseSchemaUpdate) || ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_CREATE.equals(databaseSchemaUpdate)) {
            dbSchemaCreate();
        } else if (org.activiti.engine.ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE.equals(databaseSchemaUpdate)) {
            dbSchemaCheckVersion();
        } else if (ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE.equals(databaseSchemaUpdate)) {
            dbSchemaUpdate();
        }
    }

根据不同的配置走不同的逻辑 读取之前初始化 xml 的  <property name="databaseSchemaUpdate" value="drop-create" />

public void dbSchemaCreate() {
        if (isEngineTablePresent()) {
            String dbVersion = getDbVersion();
            if (!ProcessEngine.VERSION.equals(dbVersion)) {
                throw new ActivitiWrongDbException(ProcessEngine.VERSION,
                                                   dbVersion);
            }
        } else {
            dbSchemaCreateEngine();
        }

        if (dbSqlSessionFactory.isDbHistoryUsed()) {
            dbSchemaCreateHistory();
        }
    }

dbSchemaCreateEngine() 开始走创建数据表逻辑了

protected void dbSchemaCreateEngine() {
        executeMandatorySchemaResource("create",
                                       "engine");
    }
public String getResourceForDbOperation(String directory,
                                            String operation,
                                            String component) {
        String databaseType = dbSqlSessionFactory.getDatabaseType();
        return "org/activiti/db/" + directory + "/activiti." + databaseType + "." + operation + "." + component + ".sql";
    }




public void executeSchemaResource(String operation,
                                      String component,
                                      String resourceName,
                                      boolean isOptional) {
        InputStream inputStream = null;
        try {
            inputStream = ReflectUtil.getResourceAsStream(resourceName);
            if (inputStream == null) {
                if (isOptional) {
                    log.info("no schema resource {} for {}",
                             resourceName,
                             operation);
                } else {
                    throw new ActivitiException("resource '" + resourceName + "' is not available");
                }
            } else {
                executeSchemaResource(operation,
                                      component,
                                      resourceName,
                                      inputStream);
            }
        } finally {
            IoUtil.closeSilently(inputStream);
        }
    }

读取测试resources里面的sql文件  activiti.mysql.create.engine.sql

private void executeSchemaResource(String operation,
                                       String component,
                                       String resourceName,
                                       InputStream inputStream) {
        log.info("performing {} on {} with resource {}",
                 operation,
                 component,
                 resourceName);
        String sqlStatement = null;
        String exceptionSqlStatement = null;
        try {
            Connection connection = sqlSession.getConnection();
            Exception exception = null;
            byte[] bytes = IoUtil.readInputStream(inputStream,
                                                  resourceName);
            String ddlStatements = new String(bytes);

            // Special DDL handling for certain databases
            try {
                if (isMysql()) {
                    DatabaseMetaData databaseMetaData = connection.getMetaData();
                    int majorVersion = databaseMetaData.getDatabaseMajorVersion();
                    int minorVersion = databaseMetaData.getDatabaseMinorVersion();
                    log.info("Found MySQL: majorVersion=" + majorVersion + " minorVersion=" + minorVersion);

                    // Special care for MySQL < 5.6
                    if (majorVersion <= 5 && minorVersion < 6) {
                        ddlStatements = updateDdlForMySqlVersionLowerThan56(ddlStatements);
                    }
                }
            } catch (Exception e) {
                log.info("Could not get database metadata",
                         e);
            }

            BufferedReader reader = new BufferedReader(new StringReader(ddlStatements));
            String line = readNextTrimmedLine(reader);
            boolean inOraclePlsqlBlock = false;
            while (line != null) {
                if (line.startsWith("# ")) {
                    log.debug(line.substring(2));
                } else if (line.startsWith("-- ")) {
                    log.debug(line.substring(3));
                } else if (line.startsWith("execute java ")) {
                    String upgradestepClassName = line.substring(13).trim();
                    DbUpgradeStep dbUpgradeStep = null;
                    try {
                        dbUpgradeStep = (DbUpgradeStep) ReflectUtil.instantiate(upgradestepClassName);
                    } catch (ActivitiException e) {
                        throw new ActivitiException("database update java class '" + upgradestepClassName + "' can't be instantiated: " + e.getMessage(),
                                                    e);
                    }
                    try {
                        log.debug("executing upgrade step java class {}",
                                  upgradestepClassName);
                        dbUpgradeStep.execute(this);
                    } catch (Exception e) {
                        throw new ActivitiException("error while executing database update java class '" + upgradestepClassName + "': " + e.getMessage(),
                                                    e);
                    }
                } else if (line.length() > 0) {

                    if (isOracle() && line.startsWith("begin")) {
                        inOraclePlsqlBlock = true;
                        sqlStatement = addSqlStatementPiece(sqlStatement,
                                                            line);
                    } else if ((line.endsWith(";") && !inOraclePlsqlBlock) || (line.startsWith("/") && inOraclePlsqlBlock)) {

                        if (inOraclePlsqlBlock) {
                            inOraclePlsqlBlock = false;
                        } else {
                            sqlStatement = addSqlStatementPiece(sqlStatement,
                                                                line.substring(0,
                                                                               line.length() - 1));
                        }

                        Statement jdbcStatement = connection.createStatement();
                        try {
                            // no logging needed as the connection will log it
                            log.debug("SQL: {}",
                                      sqlStatement);
                            jdbcStatement.execute(sqlStatement);
                            jdbcStatement.close();
                        } catch (Exception e) {
                            if (exception == null) {
                                exception = e;
                                exceptionSqlStatement = sqlStatement;
                            }
                            log.error("problem during schema {}, statement {}",
                                      operation,
                                      sqlStatement,
                                      e);
                        } finally {
                            sqlStatement = null;
                        }
                    } else {
                        sqlStatement = addSqlStatementPiece(sqlStatement,
                                                            line);
                    }
                }

                line = readNextTrimmedLine(reader);
            }

            if (exception != null) {
                throw exception;
            }

            log.debug("activiti db schema {} for component {} successful",
                      operation,
                      component);
        } catch (Exception e) {
            throw new ActivitiException("couldn't " + operation + " db schema: " + exceptionSqlStatement,
                                        e);
        }
    }

执行sql

2021全网最全Activiti7教程02(Activiti7入门使用-欢迎收藏) org.activiti activiti-engine ${activiti.version} org.activiti activiti-spring ${activiti.version} org.activiti activiti-bpmn-model ${activiti.version} org.activiti activiti-bpmn-converter ${activiti.version} org.activiti activiti-json-converter. 阅读详情

相关推荐

3、Activiti-流程部署

Activiti作为一款流行的开源工作流引擎,提供了多种灵活的方式来部署业务流程定义(BPMN 2.0)。本文将介绍activiti中主要的流程部署方式。

我姓谭却弹不死你的博客 1269

MySQL升级到8x版本遇到的问题汇总

MySQL升级到8x版本遇到的问题(5个异常及其解决办法) 异常1 java.sql.SQLException: java.lang.ClassCastException:java.math.BigInteger cannot be cast to java.lang.Long 一般原因: MySQL版本升级,但项目中jar包依然是旧版本(若你没升级过且刚刚还好好的,那就应该是代码错误)。 解决办法: 在maven中配置引入依赖包,其中version采用所安装MySQL对应版本(或再新点的版本,因为有

weixin_46109017的博客 2844

不止是回退SDK:深入解读UE5.2编译时那个烦人的C4756警告与INFINITY宏的变迁

本文深入解析了UE5.2源码编译时出现的C4756警告及其背后的技术原因,探讨了Windows SDK中INFINITY宏的变迁对Unreal Engine的影响。文章详细介绍了微软修改INFINITY定义的技术考量,并提供了UE5.2应对此类问题的灵活解决方案,包括通过BuildConfiguration.xml文件精确控制工具链版本,确保构建系统的可重复性和可配置性。

weixin_27180827的博客 311

Flowable源码注释(四)引擎配置抽象类

Flowable源码地址:https://github.com/flowable/flowable-engine AbstractEngineConfiguration引擎配置抽象类 public abstract class AbstractEngineConfiguration { protected final Logger logger = LoggerFactory.getLogger(getClass()); /** 表示“无租户”的租户id */ public st

jinyangjie的博客 1047

Android HWC硬件合成器实战:从SurfaceFlinger到显示驱动的完整流程解析

本文深入解析Android HWC硬件合成器从SurfaceFlinger到显示驱动的完整流程,揭示HWC如何优化图形性能并降低功耗。通过实战案例和调试技巧,帮助开发者掌握硬件加速的图层混合技术,提升移动设备的显示效率。

gaochao的博客 494

SI案例分享--PCB通孔互连新技术的应用(VeCS)

本文介绍了VeCS的物理结构和制造过程,并通过全波仿真模拟和测量,分析了VeCS的电性能,并与传统的测量方法进行了比较。结果表明,由于有一个连续的参考平面,VeCS的TDR阻抗可以很容易地控制到目标阻抗,同时可以大大减轻信道上的串扰,的确是一种性能不错的PCB互连创新设计方案。

一只豌豆象的博客 2116

activiti源码-2-ProcessEngineConfigurationImpl初始化

ProcessEngineConfigurationImpl.init方法中,第一个初始化的工作是initConfigurators,对引擎配置信息进行初始化,

mmllllmm的专栏 4330

[关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

本文主要讲解Gephi绘制作者间的关系图谱,该软件可以广泛应用于社交网络、知识图谱分析,推荐读者使用。这是非常基础的一篇文章,重点讲解Gephi使用方法,希望对大家有所帮助。

杨秀璋的专栏 1万+

Activiti入门教程三(详解流程引擎配置)

在先前的博客中提到了有关ProcessEngineConfiguration创建,但并没有详细的解释,主要创建的几个方法,那么这篇博客就来谈一谈有关ProcessEngineConfiguration一些创建操作。 ProcessEngineConfiguration类  该类代表一个Activiti流程引擎的配置,提供了一系列静态方法,用来读取和解析相应的配置文件,并返回Proces

1万+

【天气雷达】双偏振产品-差分反射率ZDR详解

双偏振产品-差分反射率ZDR详解。

珞瑜的博客 5408

RuoYi-activiti核心源码解析:Activiti五大服务对象的职责划分与常用API速查表

RuoYi-activiti 是一个整合若依框架与 Activiti 6.0 的开源工作流开发平台,集流程设计、流程部署、流程执行、任务办理、流程监控于一体。想要读懂它的后端源码,抓住 **Activiti 五大服务对象**就抓住了主线——`RepositoryService`、`RuntimeService`、`TaskService`、`HistoryService`、`ManagementS

gitblog_00013的博客 892

【局部规划模块轨迹优化算法】Teb_planner规划算法

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对****做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容由于ROS中的局部路径规划器比较老了,所以我推荐大家使用比较新的局部路径规划器teb_local_planner。teb_local_planner是基于弹性时间带碰撞约束的算法,算法将动态障碍物、运行时效、路径平滑性等约束做综合考虑,在复杂环境下有更优秀的表现。

qq_35635374的博客 951

activiti源码解析 1

摘自 https://blog.youkuaiyun.com/bluejoe2000/article/details/41790771 Activiti是业界很流行的java工作流引擎,关于Activiti与JBPM5的关系和如何选择不是本文要讨论的话题,相关内容可以baidu一下。Activiti从架构角度看是比较优秀的,是很面向对象的,是我所阅读过的代码结构很棒的开源软件,个人认为比Spring,Hibernate的要好。 Activiti的基础编程框架 Activiti基于Spring,ibatis等开源中间件

jtf19901223的博客 491

PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来

PPT里全是文字且很拥挤怎么办?本篇教你使用7种不同的排版让你的PPT瞬间变得高大上起来。

打造全国最全的AI Agent开发知识领域的博客 5022

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Activiti工作流引擎基础入门【收藏可做笔记系列】

表分类表名解释| 一般数据 | | || | [ACT_GE_BYTEARRAY] | 通用的流程定义和流程资源 || | [ACT_GE_PROPERTY] | 系统相关属性 || 流程历史记录 | | || | [ACT_HI_ACTINST] | 历史的流程实例 || | [ACT_HI_ATTACHMENT] | 历史的流程附件 || | [ACT_HI_COMMENT] | 历史的说明性信息 |

2401_84093973的博客 1395

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Activiti 工作流入门+源码

定义 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。 自动生成数据表 Activiti可以通过代码自动创建需要的23张表。 运行下面的main方法就可以自动创建Activiti需要的表。 package com.xsz.demo; import org.activiti.engine.ProcessEngine; .

心猿意码 1615

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【activiti6】玩儿转官方demo:activiti-app

本教程用于记录activiti-app中的模型、实例、任务、自定义表单、决策表的使用体验,以提升对activiti的理解,便于更进一步的学习 activiti简介 一款优秀的老牌开源流程框架,以bpmn作为流程的定义模型,从github上看,最早的一个文件都是十年前,从时间上看是完全经得起考验的,并且本身足够强大,功能也相当丰富,前前后后经历了5-6-7三个版本,目前官方主要维护activiti7。本文主要基于activiti6学习和体验。 流程引擎的主要工作则是:将业务流程图运转起来,如:请假审批中,.

siwash的博客 1614

Activiti理解

Activiti学习

baiofchao 936

Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化

Activity6 快速入门安装 BPM 插件加依赖Log4j 配置初始化 ProcessEngine代码初始化activiti.cfg.xml 初始化 安装 BPM 插件 我这里用的是 IDEA Settings ➡ Plugins 搜索 actiBPM 安装即可 加依赖 <!-- Activity --> <dependency> <groupId&gt...

乐之终曲 1万+

springboot/springcloud 整合activiti工作流和在线画图 带源码

1、 项目框架 springboot + activiti + mysql + mybatis + thymeleaf 2、工作流可在线编辑、支持自由跳转、支持驳回、支持驳回到原点 3、工作流整合自己业务的用户权限,支持配置多用户、多角色 4、功能接口包括:我发起的记录、我操作的记录、我待办的记录 5、管理页面包含:模型列表、流程列表、节点列表 6、上一波效果图: https://b...

艾斯-李的博客 2万+

Activiti7学习(基础篇)& 学习链接

工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之 间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者 促使此目标的实现”。

pscool的博客 736

流程引擎之Activiti简介

Activiti 是一个开源架构的工作流引擎,基于 bpmn2.0 标准进行流程定义,其前身是 jBPM,Activiti 相对于 jBPM 更轻量,更易上手,且天然集成了 Spring。2010年 jBPM 创始人 Tom Baeyens 离开 JBoss,随之加入 Alfresco 后很快推出了新的基于 jBPM4 的开源工作流系统 Activiti5。

聚焦AI技术前沿,深度解析大模型原理与多场景应用,探索最新突破与落地实践,助力行业洞悉趋势,驱动智能转型,赋能千行百业。 4120

Activiti 流程配置可视化:SpringBoot 集成 Activiti6 + Activiti Modeler

Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化 7大服务与核心表23张表概览7大核心服务(重要) 加依赖内部日志初始化 ProcessEngine代码初始化activiti.cfg.xml 初始化我的初始化示例 集成 Activiti Modeler下载源码新增依赖代码集成前端代码集成后端代码集成结构 代码修改Rep...

佛系写BUG的博客 5113

【工作流】Activiti工作流简介以及Spring Boot 集成 Activiti7

文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninigActiviti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。

DreamSun的博客 2675

前后端分离Springboot 整合使用activiti7教程(一)(全网最细)

SpringBootyuActiviti7的详细整合使用,笔记整理不易,请继续关注订阅专栏

谁说自己不可以 1万+
上一篇: Mybatis model、xml、mapper 生成
下一篇: JavaWeb API接口参数校验框架
Chengdu.S
博客等级 码龄9年 283粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Chengdu.S

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

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

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

打赏作者

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

抵扣说明:

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

余额充值