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

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日

相关文章

  • sqlserver2005 master与msdb数据库备份恢复过程

    备份和恢复是SQL Server数据库管理中的重要方面。在备份和恢复过程中,Master数据库和MSDB数据库也需要特别注意。下面是SQL Server 2005中Master和MSDB数据库备份恢复的完整攻略: 备份Master数据库 Master数据库是SQL Server中最重要的系统数据库之一,该数据库包含SQL Server实例配置信息、用户账户和…

    database 2023年5月21日
    00
  • Centos 6.4源码安装mysql-5.6.28.tar.gz教程

    下面我将为您详细讲解“Centos 6.4源码安装mysql-5.6.28.tar.gz教程”的完整攻略: 1. 下载Mysql源码 首先需要从官网下载MySQL的源码,下载地址为:https://dev.mysql.com/downloads/mysql/5.6.html 2. 安装编译工具 在安装MySQL之前,需要先安装一些编译工具,如 gcc 等,可…

    database 2023年5月22日
    00
  • SQL 列举非索引外键

    SQL(Structured Query Language)是一种专门用来操作关系型数据库的语言,外键是关系型数据库中的一个重要概念,它用来建立表与表之间的关系。在实际使用中,一张数据表往往会存在多个外键。本篇文章将为你详细讲解SQL中非索引外键的完整攻略,包含以下两个方面: 什么是非索引外键? 非索引外键的使用实例 什么是非索引外键? 外键是指一个表中的字…

    database 2023年3月27日
    00
  • redis数据库写入数据时提示redis.exceptions.ResponseError错误

    今天运行Django项目在redis数据库写入数据时提示如下错误: ERROR log 228 Internal Server Error: /image_code/cf9ccd75-d274-45c0-94a4-a83c8c189965/ Traceback (most recent call last): File “/home/sky/.virtual…

    Redis 2023年4月13日
    00
  • MongoDb CPU利用率过高问题如何解决

    MongoDB CPU利用率过高问题是MongoDB应用中经常遇到的问题之一,通常情况下这种现象是由于一些特定的负载情况或者硬件配置不当所导致的。以下是MongoDB CPU利用率过高问题的解决攻略。 1. 定位CPU利用率过高的原因 首先需要确认MongoDB CPU利用率过高的原因,很有可能是由于过多的查询请求、大量的写入请求等负载问题导致的。可以通过使…

    database 2023年5月22日
    00
  • BMS和EMS的区别

    BMS(Battery Management System)和EMS(Energy Management System)是电池管理系统和能量管理系统,这两个概念是由电力电子技术在电动汽车和新能源领域引入的。虽然它们是相关的,但它们的功能和应用范围不同。 BMS是电池管理系统,用于维护电动车电池的健康、充电和放电状态的监控和控制。BMS需要实时测量电池的电压、…

    database 2023年3月27日
    00
  • MySQL中数据查询语句整理大全

    MySQL是一款常用的关系型数据库管理系统,其数据查询语句又是使用频率非常高的功能之一。本文主要介绍MySQL中数据查询语句的整理大全。具体步骤如下: 1. 查询语句的分类 查询语句的分类包括常用语句、聚合函数、分组查询、联表查询等。 2. 常用语句的介绍 常用语句包括SELECT、WHERE、ORDER BY、LIMIT等。其中SELECT是最为常用的查询…

    database 2023年5月21日
    00
  • Oracle 触发器实现主键自增效果

    首先,我们需要了解什么是触发器(Trigger),触发器是Oracle中一种特殊的存储过程,它会在数据表的数据发生某些特定的操作时自动执行,类似于事件监听器。触发器可用于多种场景,比如验证数据、日志记录、自动更新等。 在Oracle中,一般是通过序列(Sequence)来实现主键自增的功能。但是,如果你不想使用序列来实现主键自增,而是希望通过触发器来实现,也…

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