前言
processEngine 的创建流程。
一、AppEngineFactoryBean 初始化
1、在 AppEngineServicesAutoConfiguration 配置类中创建了Bean AppEngineFactoryBean
@Bean(name="flowableAppEngine")
public AppEngineFactoryBean appEngine(SpringAppEngineConfiguration configuration) throws Exception {
//创建 AppEngineFactoryBean
AppEngineFactoryBean appEngineFactoryBean = new AppEngineFactoryBean();
appEngineFactoryBean.setAppEngineConfiguration(configuration);
//回调 EngineConfigurationConfigurer
invokeConfigurers(configuration);
return appEngineFactoryBean;
}
2、invokeConfigurers( )
调用EngineConfigurationConfigurer 的 configure( ),最终是将 EngineConfigurator 存入到 EngineConfigurator 的 configurators 列表中。
protected void invokeConfigurers(T engineConfiguration) {
engineConfigurers.forEach(configurer -> configurer.configure(engineConfiguration));
}
二、AppEngine
上一步中创建了 AppEngineFactoryBean,它实现了 FactoryBean 接口,则会在用到时候调用 getObject() 方法,下面分析一下这个方法
1、getObject()
@Override
public AppEngine getObject() throws Exception {
configureExternallyManagedTransactions();
if (appEngineConfiguration.getBeans() == null) {
appEngineConfiguration.setBeans(new SpringBeanFactoryProxyMap(applicationContext));
}
//构建AppEngine
this.appEngine = appEngineConfiguration.buildAppEngine();
return this.appEngine;
}
2、buildAppEngine()
@Override
public AppEngine buildAppEngine() {
//调用父类
AppEngine appEngine = super.buildAppEngine();
//设置引擎初始化
AppEngines.setInitialized(true);
//添加到 enginesBuild,会在当前类的 start() 中调用
enginesBuild.add(appEngine.getName());
return appEngine;
}
3、super.buildAppEngine()
AppEngineConfiguration.java
public AppEngine buildAppEngine() {
init();
return new AppEngineImpl(this);
}
4、init()
protected void init() {
//引擎配置
initEngineConfigurations();
//合并已经加载的和通过spi机制获取到的 EngineConfigurator
initConfigurators();
//调用 EngineConfigurator 的 beforeInit()
configuratorsBeforeInit();
//时钟 DefaultClockImpl
initClock();
//ObjectMapper
initObjectMapper();
//CommandContextFactory
initCommandContextFactory();
//SpringTransactionContextFactory
initTransactionContextFactory();
//DefaultCommandConfig、SchemaCommandConfig、CommandInvoker、CommandInterceptors、CommandExecutor
initCommandExecutors();
//CommandExecutor
initIdGenerator();
//包装 applicationContext
initBeans();
//FlowableExpressionFactory
initExpressionManager();
if (usingRelationalDatabase) {
//初始化数据源、数据库类型,使用spring ioc中的Datasource
initDataSource();
}
if (usingRelationalDatabase || usingSchemaMgmt) {
//数据库表相关 CommonDbSchemaManager、AppDbSchemaManager、IdentityLinkDbSchemaManager、VariableDbSchemaManager
initSchemaManager();
//执行表的update相关 SchemaOperationsAppEngineBuild
initSchemaManagementCommand();
}
//操作数据库的service
configureVariableServiceConfiguration();
//变量类型
initVariableTypes();
// 事务 ManagedTransactionFactory
initTransactionFactory();
if (usingRelationalDatabase) {
//初始化 ManagedTransactionFactory ,加载 flowable的Mapper.xml文件
initSqlSessionFactory();
}
//SessionFactories
initSessionFactories();
//给 CommonEngineServiceImpl 设置 CommandExecutor
initServices();
//操作数据库的方法相关 MybatisPropertyDataManager、MybatisByteArrayDataManager、MybatisAppDeploymentDataManager、MybatisResourceDataManager、MybatisAppDefinitionDataManager
initDataManagers();
//操作数据库的方法相关
initEntityManagers();
//EngineDeployer
initDeployers();
//缓存 DefaultDeploymentCache
initAppDefinitionCache();
//AppResourceConverterImpl
initAppResourceConverter();
//AppDeploymentManager
initDeploymentManager();
//用户关联相关 IdentityLink
initIdentityLinkServiceConfiguration();
//变量相关
initVariableServiceConfiguration();
//调用 EngineConfigurator 的 configure() 方法
configuratorsAfterInit();
//时间相关 BusinessCalendar
initBusinessCalendarManager();
}
5、configuratorsAfterInit()
public void configuratorsAfterInit() {
for (EngineConfigurator configurator : allConfigurators) {
logger.info("Executing configure() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
configurator.configure(this);
}
}
这里面有6个EngineConfigurator,会调用各自的configure()方法创建引擎。
三、ProcessEngine
从调用 SpringProcessEngineConfigurator.configure() 方法开始,其他引擎也是这种方式进行创建。
1、configure()
@Override
public void configure(AbstractEngineConfiguration engineConfiguration) {
if (processEngineConfiguration == null) {
processEngineConfiguration = new SpringProcessEngineConfiguration();
}
if (!(processEngineConfiguration instanceof SpringProcessEngineConfiguration)) {
throw new FlowableException("SpringProcessEngineConfigurator accepts only SpringProcessEngineConfiguration. " + processEngineConfiguration.getClass().getName());
}
//初始化 SpringProcessEngineConfiguration 的普通属性
initialiseCommonProperties(engineConfiguration, processEngineConfiguration);
SpringEngineConfiguration springEngineConfiguration = (SpringEngineConfiguration) engineConfiguration;
SpringProcessEngineConfiguration springProcessEngineConfiguration = (SpringProcessEngineConfiguration) processEngineConfiguration;
springProcessEngineConfiguration.setTransactionManager(springEngineConfiguration.getTransactionManager());
if (springProcessEngineConfiguration.getBeans() == null) {
springProcessEngineConfiguration.setBeans(springProcessEngineConfiguration.getBeans());
}
//初始化 SpringProcessEngineConfiguration
initProcessEngine();
initServiceConfigurations(engineConfiguration, processEngineConfiguration);
}
2、initProcessEngine()
@Override
protected synchronized ProcessEngine initProcessEngine() {
if (processEngineConfiguration == null) {
throw new FlowableException("ProcessEngineConfiguration is required");
}
return processEngineConfiguration.buildProcessEngine();
}
3、buildProcessEngine()
@Override
public ProcessEngine buildProcessEngine() {
//调用父类方法构建引擎
ProcessEngine processEngine = super.buildProcessEngine();
//设置ProcessEngine已经初始化
ProcessEngines.setInitialized(true);
enginesBuild.add(processEngine.getName());
return processEngine;
}
4、super.buildProcessEngine()
public ProcessEngine buildProcessEngine() {
//初始化
init();
//创建引擎实现类
ProcessEngineImpl processEngine = new ProcessEngineImpl(this);
if (handleProcessEngineExecutorsAfterEngineCreate) {
//启动执行器执行任务
processEngine.startExecutors();
}
// trigger build of Flowable 5 Engine
//构建Flowable 5 的引擎
if (flowable5CompatibilityEnabled && flowable5CompatibilityHandler != null) {
commandExecutor.execute(new Command<Void>() {
@Override
public Void execute(CommandContext commandContext) {
flowable5CompatibilityHandler.getRawProcessEngine();
return null;
}
});
}
//做一些校验等后处理
postProcessEngineInitialisation();
return processEngine;
}
5、init()
所有引擎的初始化都使用同样的方式
public void init() {
initEngineConfigurations();
initConfigurators();
configuratorsBeforeInit();
initClock();
initObjectMapper();
//流程图生成相关
initProcessDiagramGenerator();
initCommandContextFactory();
initTransactionContextFactory();
initCommandExecutors();
initIdGenerator();
initHistoryLevel();
initFunctionDelegates();
initAstFunctionCreators();
initDelegateInterceptor();
initBeans();
initExpressionManager();
initAgendaFactory();
if (usingRelationalDatabase) {
initDataSource();
} else {
initNonRelationalDataSource();
}
if (usingRelationalDatabase || usingSchemaMgmt) {
initSchemaManager();
initSchemaManagementCommand();
}
configureVariableServiceConfiguration();
configureJobServiceConfiguration();
initHelpers();
initVariableTypes();
initFormEngines();
initFormTypes();
initScriptingEngines();
initBusinessCalendarManager();
initServices();
initWsdlImporterFactory();
initBehaviorFactory();
initListenerFactory();
//Bpmn解析器
initBpmnParser();
initProcessDefinitionCache();
initProcessDefinitionInfoCache();
initAppResourceCache();
initKnowledgeBaseCache();
initJobHandlers();
initHistoryJobHandlers();
initTransactionFactory();
if (usingRelationalDatabase) {
initSqlSessionFactory();
}
initSessionFactories();
initDataManagers();
initEntityManagers();
initCandidateManager();
initVariableAggregator();
initHistoryManager();
initChangeTenantIdManager();
initDynamicStateManager();
initProcessInstanceMigrationValidationManager();
initIdentityLinkInterceptor();
initJpa();
initDeployers();
initEventHandlers();
initFailedJobCommandFactory();
initEventDispatcher();
initProcessValidator();
initFormFieldHandler();
initDatabaseEventLogging();
initFlowable5CompatibilityHandler();
initVariableServiceConfiguration();
initIdentityLinkServiceConfiguration();
initEntityLinkServiceConfiguration();
initEventSubscriptionServiceConfiguration();
initTaskServiceConfiguration();
initJobServiceConfiguration();
initBatchServiceConfiguration();
initAsyncExecutor();
initAsyncHistoryExecutor();
configuratorsAfterInit();
afterInitTaskServiceConfiguration();
afterInitEventRegistryEventBusConsumer();
initHistoryCleaningManager();
initLocalizationManagers();
}
6、注册引擎
init()方法执行后,会创建ProcessEngineImpl,会在创建过程中注册引擎
ProcessEngineImpl processEngine = new ProcessEngineImpl(this);
public ProcessEngineImpl(ProcessEngineConfigurationImpl processEngineConfiguration) {
...
//注册ProcessEngine
ProcessEngines.registerProcessEngine(this);
//调用流程引擎生命周期方法
if (processEngineConfiguration.getEngineLifecycleListeners() != null) {
for (EngineLifecycleListener engineLifecycleListener : processEngineConfiguration.getEngineLifecycleListeners()) {
engineLifecycleListener.onEngineBuilt(this);
}
}
//发布流程引擎创建的事件
processEngineConfiguration.getEventDispatcher().dispatchEvent(FlowableEventBuilder.createGlobalEvent(FlowableEngineEventType.ENGINE_CREATED),
processEngineConfiguration.getEngineCfgKey());
}
7、registerProcessEngine()
public static void registerProcessEngine(ProcessEngine processEngine) {
//引擎名称默认是default
processEngines.put(processEngine.getName(), processEngine);
}
四、AlreadyInitializedAppEngineConfiguration
1、配置类中定义了流程引擎的bean
@Bean
public ProcessEngine processEngine(@SuppressWarnings("unused") @Autowired AppEngine appEngine) {
// The app engine needs to be injected, as otherwise it won't be initialized, which means that the ProcessEngine is not initialized yet
if (!ProcessEngines.isInitialized()) {
throw new IllegalStateException("BPMN engine has not been initialized");
}
return ProcessEngines.getDefaultProcessEngine();
}
方法参数自动注入了 AppEngine 对象,在解析当前bean的 AppEngine 参数时,会触发 AppEngine 的初始化,进而触发第二步中的 AppEngineFactoryBean 的 getObject() 方法去初始化各个引擎,然后就可以获取默认的流程引擎了
2、ProcessEngines.getDefaultProcessEngine()
public static ProcessEngine getDefaultProcessEngine() {
return getProcessEngine(NAME_DEFAULT);
}
public static ProcessEngine getProcessEngine(String processEngineName) {
if (!isInitialized()) {
init();
}
return processEngines.get(processEngineName);
}
如果初始化了,直接获取;
如果没有初始化,则调用init()方法进行初始化,读取 flowable.cfg.xml 和 flowable-context.xml 配置文件进行流程引擎的初始化。