【Flowable 7】学习笔记 01 - 初始化数据库表创建流程(源码)

文章目录

前言

前段时间,RuoYi-Vue-Plus 迎来了 v5.2.0-BETA 版本,其中新增了工作流 Flowable 7

在工作中几乎没有使用过工作流,这一内容是比较陌生的,我在b站上能找到的学习的视频都不算十分满意,大多其实只是讲解如何使用,相关的书(中文版)也比较少,至于原理还是需要自己看源码或者 debug,所以还是需要慢慢学习,接下来如果有空会更新。

本文主要是记录一下初始化建表的流程,作为后续学习参考。可能会有错误的地方,或者是不完善的地方,请见谅。

版本说明

  1. 框架 RuoYi-Vue-Plus 版本:5.2.0-BETAdev 分支)
  2. Flowable 版本:7.0.0

配置

  1. Flowable 模块:ruoyi-modules/ruoyi-workflow(本文暂不涉及)
  2. 配置:ruoyi-admin/src/main/resources/application.yml
yaml 复制代码
--- #flowable配置
flowable:
  async-executor-activate: false #关闭定时任务JOB
  #  将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。
  database-schema-update: true
  activity-font-name: 宋体
  label-font-name: 宋体
  annotation-font-name: 宋体
  # 关闭各个模块生成表,目前只使用工作流基础表
  idm:
    enabled: false
  cmmn:
    enabled: false
  dmn:
    enabled: false
  app:
    enabled: false

上面的配置中只生成了基础表,其他模块相关表没有生成,所以暂且不关心。结合 AI 简单说明一下各个模块:

  • IDM(Identity Management):身份管理模块,用于管理用户、组织和权限。 它负责处理用户身份验证、授权和用户组管理等任务,以确保系统的安全性和权限控制。

  • CMMN(Case Management Model and Notation):案例管理模块,用于建模和执行复杂的业务案例。 CMMN提供了一种规范的方法来描述业务案例、案例实例和案例任务之间的关系,使得在复杂业务场景下的处理和管理变得更加灵活和可控。

  • DMN(Decision Model and Notation):决策建模与表示模块,用于建模和执行业务决策逻辑。 DMN提供了一种标准的方式来描述决策表、决策规则和决策过程,帮助业务系统更好地实现自动化决策和业务规则管理。

  • APP(Application):应用模块,提供了一个基于Web的用户界面,用于管理和监控流程、任务和案例。 APP模块使得用户能够通过浏览器访问Flowable引擎,进行流程定义、部署、启动、任务处理等操作,从而方便地管理和参与到业务流程中。

1、引擎配置初始化

初始化执行的主要方法:
org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#init

这个方法用于初始化 Flowable 引擎的配置和各种组件:

  1. initEngineConfigurations():初始化引擎配置。
  2. initConfigurators():初始化配置器。
  3. configuratorsBeforeInit():在初始化之前配置器的初始化。
  4. initClock():初始化时钟。
  5. initObjectMapper():初始化对象映射器。
  6. initProcessDiagramGenerator():初始化流程图生成器。
  7. initCommandContextFactory():初始化命令上下文工厂。
  8. initTransactionContextFactory():初始化事务上下文工厂。
  9. initCommandExecutors():初始化命令执行器。
  10. initIdGenerator():初始化ID生成器。
  11. initHistoryLevel():初始化历史级别。
  12. initFunctionDelegates():初始化函数委托。
  13. initAstFunctionCreators():初始化AST函数创建器。
  14. initDelegateInterceptor():初始化委托拦截器。
  15. initBeans():初始化Beans。
  16. initExpressionManager():初始化表达式管理器。
  17. initMailClients():初始化邮件客户端。
  18. initAgendaFactory():初始化议程工厂。
  19. 根据数据库是否使用,选择性初始化数据源:initDataSource()initNonRelationalDataSource()
  20. 如果使用关系型数据库或者使用模式管理,初始化模式管理器。
  21. 配置变量服务配置和作业服务配置。
  22. initHelpers():初始化助手。
  23. initVariableTypes():初始化变量类型。
  24. initFormEngines():初始化表单引擎。
  25. initFormTypes():初始化表单类型。
  26. initScriptBindingsFactory():初始化脚本绑定工厂。
  27. initScriptingEngines():初始化脚本引擎。
  28. initBusinessCalendarManager():初始化业务日历管理器。
  29. initServices():初始化服务。
  30. initWsdlImporterFactory():初始化WSDL导入器工厂。
  31. initBehaviorFactory():初始化行为工厂。
  32. initListenerFactory():初始化监听器工厂。
  33. initBpmnParser():初始化BPMN解析器。
  34. initProcessDefinitionCache():初始化流程定义缓存。
  35. initProcessDefinitionInfoCache():初始化流程定义信息缓存。
  36. initAppResourceCache():初始化应用资源缓存。
  37. initKnowledgeBaseCache():初始化知识库缓存。
  38. initJobHandlers()initHistoryJobHandlers():初始化作业处理程序和历史作业处理程序。
  39. initTransactionFactory():初始化事务工厂。
  40. 如果使用关系型数据库,初始化SQL会话工厂。
  41. initSessionFactories():初始化会话工厂。
  42. initDataManagers():初始化数据管理器。
  43. initEntityManagers():初始化实体管理器。
  44. initProcessDefinitionDeploymentDeletionManager():初始化流程定义部署删除管理器。
  45. initCandidateManager():初始化候选人管理器。
  46. initVariableAggregator():初始化变量聚合器。
  47. initDependentScopeTypes():初始化依赖范围类型。
  48. initHistoryConfigurationSettings():初始化历史配置设置。
  49. initHistoryManager():初始化历史管理器。
  50. initChangeTenantIdManager():初始化更改租户ID管理器。
  51. initDynamicStateManager():初始化动态状态管理器。
  52. initProcessInstanceMigrationValidationManager():初始化流程实例迁移验证管理器。
  53. initIdentityLinkInterceptor():初始化身份链接拦截器。
  54. initJpa():初始化JPA。
  55. initDeployers():初始化部署器。
  56. initEventHandlers():初始化事件处理程序。
  57. initFailedJobCommandFactory():初始化失败作业命令工厂。
  58. initEventDispatcher():初始化事件分发器。
  59. initProcessValidator():初始化流程验证器。
  60. initFormFieldHandler():初始化表单字段处理程序。
  61. initDatabaseEventLogging():初始化数据库事件日志记录。
  62. initFlowable5CompatibilityHandler():初始化Flowable 5兼容性处理程序。
  63. initVariableServiceConfiguration()initIdentityLinkServiceConfiguration()initEntityLinkServiceConfiguration()initEventSubscriptionServiceConfiguration()initTaskServiceConfiguration()initJobServiceConfiguration()initBatchServiceConfiguration():初始化各种服务配置。
  64. initAsyncTaskInvoker()initAsyncExecutor()initAsyncHistoryExecutor():初始化异步任务调用程序、异步执行器和异步历史执行器。
  65. configuratorsAfterInit():在初始化之后的配置器初始化。
  66. afterInitTaskServiceConfiguration()afterInitEventRegistryEventBusConsumer():在初始化任务服务配置之后和初始化事件注册表事件总线消费者之后的操作。
  67. initHistoryCleaningManager():初始化历史清理管理器。
  68. initLocalizationManagers():初始化本地化管理器。

2、SQL 执行创建表

2.0、创建表概览(创建表数目:38)

序号 SQL文件名(生成表数量) 创建表名称 生成逻辑对应 Manager 备注
1. flowable.mysql.create.common.sql(2) ACT_GE_PROPERTY ACT_GE_BYTEARRAY CommonDbSchemaManager
2. liquibase.sqlgenerator.SqlGenerator(2) FLW_EV_DATABASECHANGELOGLOCK FLW_EV_DATABASECHANGELOG 执行方法: CreateDatabaseChangeLogLockTableGenerator#generateSql CreateDatabaseChangeLogTableGenerator#generateSql
3. flowable-eventregistry-db-changelog.xml(4) FLW_EVENT_DEPLOYMENT FLW_EVENT_RESOURCE FLW_EVENT_DEFINITION FLW_CHANNEL_DEFINITION EventDbSchemaManager (包含三个部分 changeSet
4. flowable.mysql.create.identitylink.sql(1) ACT_RU_IDENTITYLINK IdentityLinkDbSchemaManager
5. flowable.mysql.create.identitylink.history.sql(1) ACT_HI_IDENTITYLINK IdentityLinkDbSchemaManager
6. flowable.mysql.create.entitylink.sql(1) ACT_RU_ENTITYLINK EntityLinkDbSchemaManager
7. flowable.mysql.create.entitylink.history.sql(1) ACT_HI_ENTITYLINK EntityLinkDbSchemaManager
8. flowable.mysql.create.eventsubscription.sql(1) ACT_RU_EVENT_SUBSCR EventSubscriptionDbSchemaManager
9. flowable.mysql.create.task.sql(1) ACT_RU_TASK TaskDbSchemaManager
10. flowable.mysql.create.task.history.sql(2) ACT_HI_TASKINST ACT_HI_TSK_LOG TaskDbSchemaManager
11. flowable.mysql.create.variable.sql(1) ACT_RU_VARIABLE VariableDbSchemaManager
12. flowable.mysql.create.variable.history.sql(1) ACT_HI_VARINST VariableDbSchemaManager
13. flowable.mysql.create.job.sql(6) ACT_RU_JOB ACT_RU_TIMER_JOB ACT_RU_SUSPENDED_JOB ACT_RU_DEADLETTER_JOB ACT_RU_HISTORY_JOB ACT_RU_EXTERNAL_JOB JobDbSchemaManager
14. flowable.mysql.create.batch.sql(2) FLW_RU_BATCH FLW_RU_BATCH_PART BatchDbSchemaManager
15. flowable.mysql.create.engine.sql(7) ACT_RE_DEPLOYMENT ACT_RE_MODEL ACT_RU_EXECUTION ACT_RE_PROCDEF ACT_EVT_LOG ACT_PROCDEF_INFO ACT_RU_ACTINST ProcessDbSchemaManager
16. flowable.mysql.create.history.sql(5) ACT_HI_PROCINST ACT_HI_ACTINST ACT_HI_DETAIL ACT_HI_COMMENT ACT_HI_ATTACHMENT ProcessDbSchemaManager

同样结合 AI 说明一下表前缀:

  1. ACT_RE(Repository)

    • 存储静态信息:这个前缀表示repository,即存储。带有这个前缀的表包含的是静态信息,例如流程定义和流程的资源(如图片、规则等)。
    • 与建模相关的操作:这些表通常是由RepositoryService接口操作,涉及到流程定义的部署、查询和管理等操作。
  2. ACT_RU(Runtime)

    • 存储运行时数据:这个前缀表示runtime,即运行时。带有这个前缀的表存储着流程变量、用户任务、变量、职责(job)等运行时的数据。
    • 流程实例执行期间的数据:Flowable只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快,提高了性能。
  3. ACT_ID(Identity)

    • 管理组织机构信息:这个前缀表示identity,即身份。带有这个前缀的表包含标识的信息,如用户、用户组等组织机构相关的数据。
    • 支持用户身份管理和权限控制:这些表支持用户身份的创建、修改、删除、密码修改、登录等功能,以及用户分组和权限管理。
  4. ACT_HI(History)

    • 存储历史数据:这个前缀表示history,即历史。带有这个前缀的表包含着历史的相关数据,如结束的流程实例、变量、任务等。
    • 审计和报告:这些表用于审计和报告目的,记录了流程实例的历史信息,方便用户查看和分析流程的执行情况。
  5. ACT_GE(General)

    • 通用数据表:这个前缀没有特定的指向,表示general,即通用。带有这个前缀的表被用于各种情况,包含通用的流程定义和流程资源等信息。
    • 系统相关属性:这些表还可能包含系统相关的属性设置,如系统的配置信息等。
  6. FLW(Flowable Work或Engage)

    • 特定于Flowable Work或Engage的表:以FLW_前缀开头的数据库表是特定于Flowable Work或Engage的,这两个产品分别提供了工作流和数字化业务流程服务。
    • 区分核心功能和特定产品功能:这样的命名方式有助于区分Flowable核心功能和特定产品功能相关的数据表。

2.1、基础组件表创建(以 common 组件为例)

common 组件是最早执行生成的,因此以 common 为例进行说明,对应的 manager 是 CommonDbSchemaManager,是 ServiceSqlScriptBasedDbSchemaManager 的扩展。不同的组件有不同的扩展:

不同的扩展 实现对应执行相关的 sql 文件,命名遵循相关的规范。common 组件对应的 sql 文件:flowable.mysql.create.common.sql

调用链:

  • org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#init
  • org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#initSchemaManager
  • org.flowable.common.engine.impl.AbstractEngineConfiguration#initSchemaManager
  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#initSchema
  • org.flowable.eventregistry.impl.db.EventDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaCreate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#internalDbSchemaCreate

sql 文件:

  • org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager#executeSchemaResource

创建表:

日志输出:

2.2、changelog 组件表创建(基于 liquibase)

在调用 flowable-eventregistry-db-changelog.xml 时,先生成了两个 changelog 表。对应的类:org.flowable.eventregistry.impl.db.EventDbSchemaManager

调用链:

  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#initSchema
  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#schemaUpdate
  • ......
  • liquibase.command.core.helpers.DatabaseChangelogCommandStep#run
  • liquibase.command.core.helpers.DatabaseChangelogCommandStep#checkLiquibaseTables
  • 1:changeLogHistoryService.init();
  • liquibase.changelog.StandardChangeLogHistoryService#init
  • ......
  • liquibase.sqlgenerator.core.CreateDatabaseChangeLogTableGenerator#generateSql
  • 2:LockServiceFactory.getInstance().getLockService(database).init();
  • liquibase.lockservice.StandardLockService#init
  • ......
  • liquibase.sqlgenerator.core.CreateDatabaseChangeLogLockTableGenerator#generateSql
  • ......
  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate (Engine | History 组件表创建)

2.3、Engine | History 组件表创建

sql 文件: flowable.mysql.create.engine.sqlflowable.mysql.create.history.sql

调用链:

  • org.flowable.spring.SpringProcessEngineConfiguration#buildProcessEngine
  • org.flowable.engine.impl.ProcessEngineImpl#ProcessEngineImpl
  • org.flowable.engine.impl.SchemaOperationsProcessEngineBuild#execute
  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate

2.4、检查表是否存在

由于配置 database-schema-updatetrue,应用每次启动,Flowable 都会检查表是否存在以及是否需要更新表。

如果设置为 false,则假定数据库已经是最新状态,不做任何更新。

设置为 validate 时,仅验证 Schema 是否匹配,不执行更新操作。

设置为 update 时,如有需要则更新 Schema。

底层判断逻辑:

  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaCreate
  • org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager#isTablePresent

  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaUpdate

(完)

相关推荐
Q_19284999066 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟23 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S34 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos42 分钟前
C++----------函数的调用机制
java·c++·算法
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Yuan_o_1 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言