Activiti工作流学习笔记之自动生成28张数据库表的底层原理解析

yizhihongxing

Activiti工作流学习笔记之自动生成28张数据库表的底层原理解析

概述

Activiti 是一个轻量级的流程引擎,是 Apache下的一个顶级项目。在 Activiti 中,流程定义(Process Definition)可以通过 XML 文件或者 Java 代码的方式进行部署。在部署流程定义的时候,Activiti 会自动地创建需要的表。在本篇文章中,我们将详细讲解 Activiti 自动生成28张数据库表的底层原理。

自动生成28张数据库表

Activiti 在部署流程定义的时候,会自动地创建需要的表,总共创建了28张表。这些表的名称前缀都是 ACT_,常用的表有下面几张:

  • ACT_RE_DEPLOYMENT: 流程部署表,记录部署的流程信息。
  • ACT_RE_PROCDEF: 流程定义表,记录每个流程定义的基本信息。
  • ACT_RU_EXECUTION: 执行流表,记录每个流程实例的执行状态。
  • ACT_RU_TASK: 任务表,记录任务信息。
  • ACT_HI_PROCINST: 历史流程实例表,记录所有流程实例的历史信息。

自动生成28张数据库表的原理

1. 初始化引擎

在 Activiti 中,流程引擎的初始化是通过 ProcessEngines 类的 init 方法实现的。在 ProcessEngines 类的 init 方法中,会读取 Activiti 的配置文件,并初始化流程引擎。具体实现如下:

public static synchronized ProcessEngine getDefaultProcessEngine() {
    if (processEngine == null) {
        processEngine = buildProcessEngine();
    }
    return processEngine;
}

private static ProcessEngine buildProcessEngine() {
    ProcessEngineConfigurationImpl processEngineConfiguration = 
        (ProcessEngineConfigurationImpl) ProcessEngineConfiguration
            .createProcessEngineConfigurationFromResourceDefault();
    return processEngineConfiguration.buildProcessEngine();
}

2. 初始化数据库

在初始化流程引擎后,Activiti 会检查数据库中是否已经有了需要的表。如果已经存在需要的表,则不会进行创建操作,否则将会自动创建需要的表。具体实现如下:

public class ProcessEngineConfigurationImpl extends ProcessEngineConfiguration {

    @Override
    public void initDatabase() {
        DbSqlSession dbSqlSession = commandExecutor.getDbSqlSession();
        boolean tableExists = isTablePresent("ACT_GE_PROPERTY");

        if (tableExists) {
            DbSchemaStrategy dbSchemaStrategy = determineDbSchemaStrategy(
                databaseType, 
                databaseCatalog, 
                databaseSchemaUpdate,
                dbSqlSession.getConnection()
            );
            dbSchemaStrategy.execute(dbSqlSession);
        } else {
            dbSqlSession.dbSchemaCreate();
        }
    }

    private boolean isTablePresent(String tableName) {
        try {
            return dbSqlSession.getSqlSession().selectOne("selectTableCount", 
                Collections.singletonMap("tableName", tableName)) != null;
        } catch (Exception e) {
            // ignore
        }
        return false;
    }
}

initDatabase 方法中,首先通过 isTablePresent 方法判断表是否存在,如果存在,则会根据 databaseSchemaUpdate 属性来决定是否更新表结构,否则将会创建需要的表。

示例说明

示例一

假设我们已经在数据库中手动创建了 Activiti 需要的表,并在 application.properties 文件中配置了数据库信息,那么我们可以在代码中通过下面的方式初始化 Activiti 的引擎,并获取流程引擎实例:

ProcessEngineConfiguration configuration = ProcessEngineConfiguration
    .createStandaloneProcessEngineConfiguration()
    .setJdbcUrl("jdbc:mysql://localhost:3306/activiti")
    .setJdbcDriver("com.mysql.jdbc.Driver")
    .setJdbcUsername("root")
    .setJdbcPassword("password")
    .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE);

ProcessEngine processEngine = configuration.buildProcessEngine();

在这个示例中,我们通过 ProcessEngineConfiguration 类的 createStandaloneProcessEngineConfiguration 方法来创建一个独立的流程引擎配置对象,并设置数据库相关的属性。然后,通过 buildProcessEngine 方法来初始化流程引擎并获取流程引擎实例。

示例二

假设我们希望在应用程序启动的时候自动初始化 Activiti 引擎,并获取流程引擎实例,我们可以在 Spring Boot 项目中配置以下代码:

@Configuration
public class ActivitiConfig {

    @Bean
    public SpringProcessEngineConfiguration processEngineConfiguration() {
        SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration();
        configuration.setDataSource(dataSource());
        configuration.setTransactionManager(transactionManager());
        configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        configuration.setAsyncExecutorActivate(true);
        return configuration;
    }

    @Bean
    public ProcessEngine processEngine() {
        return processEngineConfiguration().buildProcessEngine();
    }

    @Bean
    public DataSource dataSource() {
        // 配置数据源
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        // 配置事务管理器
    }
}

在这个示例中,我们通过在 Spring Boot 项目中定义 ActivitiConfig 类来配置 Activiti。在 processEngineConfiguration 方法中,我们通过 SpringProcessEngineConfiguration 类来创建 Spring Boot 环境下的流程引擎配置对象,并设置数据源、事务管理器等属性。然后在 processEngine 方法中通过 buildProcessEngine 方法来初始化流程引擎并获取流程引擎实例。最后在 dataSourcetransactionManager 方法中分别配置数据源和事务管理器。这样,在应用程序启动的时候,Spring Boot 就会自动地初始化 Activiti 引擎,并获取流程引擎实例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Activiti工作流学习笔记之自动生成28张数据库表的底层原理解析 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • MongoDB使用profile分析慢查询的步骤

    下面是MongoDB使用profile分析慢查询的完整攻略: 1. 开启profile功能 在MongoDB中,可以通过开启profile功能来记录所有的操作信息,包括查询操作。使用profile功能需要在MongoDB启动时指定相应的配置,并在Mongo shell中设置。 如下是MongoDB启动时的配置: mongod –profile=2 # 记录…

    database 2023年5月21日
    00
  • MySQL属性SQL_MODE学习笔记

    最近在学习《MySQL技术内幕:SQL编程》并做了笔记,本博客是一篇笔记类型博客,分享出来,方便自己以后复习,也可以帮助其他人 SQL_MODE:MySQL特有的一个属性,用途很广,可以通过设置属性来实现某些功能支持 # 全局的SQL_MODE SELECT @@global.sql_mode; # 当前会话的SQL_MODE SELECT @@sessio…

    MySQL 2023年4月13日
    00
  • pymysql 插入数据 转义处理方式

    当使用pymysql向MySQL数据库中插入数据时,需要注意字符串中可能含有引号、单引号、反斜杠等特殊字符,这些字符可能导致SQL语句语法出现错误。为了避免这种情况,需要使用转义处理方式,将特殊字符转换为可以被SQL语句安全接收的形式。 以下是pymysql插入数据的转义处理方式: 使用pymysql.escape_string()函数 pymysql.es…

    database 2023年5月22日
    00
  • Ubuntu 20.04 安装和配置MySql5.7的详细教程

    Ubuntu 20.04 安装和配置MySQL 5.7的详细教程 MySQL是一个流行的关系型数据库管理系统,它被广泛应用于 Web 应用程序的开发中。在本教程中,我们将学习如何在 Ubuntu 20.04 上安装和配置 MySQL 5.7。 步骤 1 – 更新软件包列表 在开始安装 MySQL 5.7 之前,我们需要更新 Ubuntu 20.04 的软件包…

    database 2023年5月18日
    00
  • SQL 为值区间填充缺失值

    为值区间填充缺失值是一种常见的数据清洗技术,可以将缺失值通过对应区间的均值或中位数进行填充,从而保证数据的完整性和可靠性。以下是详细的操作步骤和示例: 操作步骤 确认需要填充缺失值的列和对应的区间; 根据区间范围,将数据按照区间分组,并计算每个区间的均值或中位数; 将缺失值所在的行的区间值作为索引,匹配对应的均值或中位数,然后填充缺失值。 示例1 假设我们有…

    database 2023年3月27日
    00
  • Go语言学习之操作MYSQL实现CRUD

    Go语言学习之操作MYSQL实现CRUD 本文主要讲解如何使用Go语言操作MYSQL数据库实现CRUD(增加、查询、修改、删除)操作。 准备工作 在开始之前,需要先安装好Go语言开发环境以及MYSQL数据库,并且在Go语言项目中导入github.com/go-sql-driver/mysql驱动。 建立连接 使用Go语言连接MYSQL数据库需要用到datab…

    database 2023年5月22日
    00
  • PostgreSQL使用MySQL作为外部表(mysql_fdw)

    PostgreSQL是一个开源的关系型数据库管理系统,是业界感觉较高的一款数据库,而MySQL也是个非常流行的数据库。假如我们需要在PostgreSQL中操作MySQL的表,那么可以使用mysql_fdw这个扩展模块。 mysql_fdw是PostgreSQL的外部数据连接插件,通过创建外部表与MySQL的表进行关联,就能够实现在PostgreSQL中操作M…

    database 2023年5月22日
    00
  • MySQL常用命令与内部组件及SQL优化详情

    MySQL常用命令 登录/退出MySQL 进入MySQL命令行:mysql -u root -p 退出MySQL命令行:exit 数据库操作命令 创建数据库 CREATE DATABASE database_name; 删除数据库 DROP DATABASE database_name; 查看数据库 SHOW DATABASES; 表操作命令 创建表 CRE…

    database 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部