
2.6 初始化流程引擎
在代码清单2-14中,new ProcessEngineImpl(this)这行代码主要用于实例化ProcessEngineImpl类,该类的核心定义如代码清单2-25所示。
代码清单2-25 ProcessEngineImpl.java

尝试将以上代码的执行逻辑梳理总结如下。
(1)第2~12行进行属性填充,ProcessEngineImpl实例对象的属性值均从processEngineConfiguration对象中进行获取,这里的设计是典型的门面模式,为客户端的使用提供便利,无须关心ProcessEngineConfiguration类的内部实现机制。
(2)第13行执行数据库表生成策略。开发人员可以在配置文件中为流程引擎配置类设置databaseSchemaUpdate属性值,该属性的可选值如下所示。
• flase:默认值。流程引擎启动时,首先从ACT_GE_PROPERTY表中查询Activiti引擎的版本值(NAME_字段的值等于’schema.version'),然后获取ProcessEngine接口中定义的VERSION静态变量值,两者进行对比,如果数据库中的表不存在或者表存在但版本不匹配则直接抛出异常。
• true:流程引擎启动时会对所有的表进行更新操作(upgrade目录中的DDL脚本),如果数据库中的表不存在则开始创建表(create目录中的DDL脚本)。
• create_drop:流程引擎启动时创建表,流程引擎关闭时删除表(流程引擎的关闭形如processEngine.close())。
• drop-create:流程引擎启动时首先删除数据库中存在的表然后重新创建表(该方式不需要手动关闭流程引擎),该操作非常危险,因此不建议正式环境使用。
• create:流程引擎启动时直接创建表不管数据库是否存在表,这就意味着如果数据库中已经存在表,再次执行创建表的DDL肯定会报错,因此不建议使用。
(3)注册流程引擎。ProcessEngines.registerProcessEngine(this)方法将ProcessEngineImpl实例对象注册到ProcessEngines类中。
(4)作业执行器。第15~20行如果流程引擎配置类配置了作业执行器jobExecutor-Activate开关属性和异步作业执行器asyncExecutorActivate开关属性则需要分别启动作业执行器和异步作业执行器。有关作业执行器可以参考第9章的讲解。
(5)流程引擎生命周期监听器。如果流程引擎配置类配置有流程引擎生命周期监听器ProcessEngineLifecycleListener,则执行第22行触发流程引擎生命周期监听器中的onProcessEngineBuilt方法。
(6)转发事件。第24~26行转发事件类型为ENGINE_CREATED的事件,关于事件转发器可以参考第6章。
2.6.1 操作引擎表
了解databaseSchemaUpdate属性的含义之后,接下来分析SchemaOperationsProcess-EngineBuild命令类中execute方法的处理逻辑,如代码清单2-26所示。有关命令类的相关知识,第12章会详细讲解。
代码清单2-26 SchemaOperationsProcessEngineBuild.java

首先根据commandContext获取DbSqlSession实例对象,然后调用该实例对象的performSchemaOperationsProcessEngineBuild方法进行下一步的处理,该方法的具体实现如代码清单2-27所示。
代码清单2-27 DbSqlSession.java

该方法的处理逻辑梳理如下。
(1)根据Context类获取流程引擎配置类中的databaseSchemaUpdate属性值。
(2)根据databaseSchemaUpdate值执行如下的逻辑。
• 如果属性值为drop-create,则第5行调用dbSchemaDrop方法进行数据库表的删除工作。
• 如果属性值为create-drop、drop-create、create三者中的任意一个,则第13行调用dbSchemaCreate方法进行数据库表的创建工作。
• 如果该属性值为false,则第16行调用dbSchemaCheckVersion方法对数据库中存在的版本值与ProcessEngine接口中定义的版本值进行比对。
• 如果该属性值为true,则第19行调用dbSchemaUpdate方法进行数据库表的升级操作。
以上数据库的DDL文件在1.3节详细讲解过,可以参考该节进行学习。
扩展
如果打算在引擎创建、删除、更新表时执行项目中的DDL脚本,可以通过扩展DbSqlSession类进行实现。