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
方法来初始化流程引擎并获取流程引擎实例。最后在 dataSource
和 transactionManager
方法中分别配置数据源和事务管理器。这样,在应用程序启动的时候,Spring Boot 就会自动地初始化 Activiti 引擎,并获取流程引擎实例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Activiti工作流学习笔记之自动生成28张数据库表的底层原理解析 - Python技术站