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日

相关文章

  • MySQL存储过程的概念与用法实例

    下面是关于“MySQL存储过程的概念与用法实例”的详细攻略。 什么是MySQL存储过程? MySQL存储过程是一种预编译的SQL代码块,其中包含一系列SQL语句。它可以接受参数、执行流程控制语句(如if语句、while循环等)和异常处理语句,可以增加SQL脚本的灵活性和可重用性。 如何创建MySQL存储过程? 我们可以在MySQL客户端中使用CREATE P…

    database 2023年5月22日
    00
  • 2.redis-help使用,基本命令

    redis 帮助 127.0.0.1:6379> help redis-cli 3.0.4 Type: “help @<group>” to get a list of commands in <group> “help <command>” for help on <command> “help &lt…

    Redis 2023年4月12日
    00
  • 如何修改Linux内核参数vm.swappiness

    修改Linux内核参数vm.swappiness的步骤如下: 第一步:了解vm.swappiness参数 vm.swappiness是Linux系统内存管理的参数之一,它决定了系统在内存不足时的行为。参数值为0-100之间的整数,0表示不将内存数据交换到硬盘上,100表示允许内存数据全部交换到硬盘上。默认值为60。 第二步:修改vm.swappiness参数…

    database 2023年5月22日
    00
  • 如何用分表存储来提高性能 推荐

    下面我将详细讲解如何用分表存储来提高性能,并提供两个示例说明。 什么是分表存储? 分表存储是将一个大表拆分成多个小表来进行存储,旨在提高性能和可维护性。在实际应用中,经常遇到需要处理海量数据的情况。而如果所有数据都存放在一个表中,就可能会导致查询效率低下和数据维护上的不便。因此我们可以把一个大表按照一定的规则(例如按照时间、按照地域或按照业务类型)拆分成多个…

    database 2023年5月19日
    00
  • 开源数据库和商业数据库的区别

    开源数据库和商业数据库的区别 数据库是一个用于存储、管理和操作数据的系统。在软件开发中,数据库是十分重要的一环。在选择数据库时,一个关键的因素就是选择开源数据库还是商业数据库。开源数据库和商业数据库有何区别呢? 开源数据库和商业数据库的定义 开源数据库:指的是可以在代码的开放许可下免费下载、修改和使用的数据库管理系统。 商业数据库:指的是需要购买许可证才能使…

    database 2023年3月27日
    00
  • Redis 5.05 单独模式安装及配置方法

    Redis 5.05 单独模式安装及配置方法 简介 Redis 是一个开源的 in-memory 数据结构存储系统,可用作数据库、缓存和消息代理。 本文将介绍 Redis 5.05 单独模式的安装方法以及必要的配置。 安装 下载 Redis 访问 Redis 官网 可以获取 Redis 的最新版本。在本文撰写时,Redis 的最新版本为 6.0.8。这里我们…

    database 2023年5月22日
    00
  • mysql慢日志使用mysqldumpslow进行分析

    环境:centos7、mysql5.7、慢日志 1、mysqldumpslow参数解析 mysql> show variables like ‘%slow_query%’; #mysql日志路径 +———————+————————————–+ | Variable_name …

    MySQL 2023年4月13日
    00
  • php执行sql语句的写法

    处理SQL语句是PHP中一个常见的任务,你可以使用不同的方法来执行SQL语句。本文将介绍在PHP中执行SQL语句的几种常见方法。 使用PDO PDO是PHP内置的访问数据库的扩展库,它支持各种各样的数据库,包括MySQL、PostgreSQL和Oracle等。使用PDO时,你不必编写针对特定数据库的代码,相反,你使用PDO提供的通用方法来执行SQL语句。 P…

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