flowable创建processEngine的流程


前言

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 配置文件进行流程引擎的初始化。

Flowable是一个开源的工作流和业务流程管理平台,它允许你设计、部署和执行复杂的业务流程。在Flowable中配置业务流程通常涉及以下几个步骤: 1. **项目初始化**: 首先需要在你的项目中引入Flowable相关的依赖库。如果你使用的是Spring Boot, 可以通过Maven或Gradle添加`org.flowable:flowable-spring-boot-starter`。 2. **创建流程定义**: 使用Process Definition API, 创建一个新的流程定义XML文件(`.bpmn20.xml`),这是描述你的流程的图形化模型。在这个文件中,你可以定义开始事件、任务、决策节点、结束事件等。 ```xml <process id="myProcess" name="My Process"> <startEvent id="start"/> <userTask id="task1" name="Task 1"/> <!-- ...更多的活动... --> <endEvent id="end"/> </process> ``` 3. **部署流程**: 通过Flowable的RuntimeService将流程定义部署到服务器,使其可以被运行。 ```java RuntimeService runtimeService = processEngine.getRuntimeService(); Deployment deployment = runtimeService.createDeployment() .addClasspathResource("myProcess.bpmn20.xml") .deploy(); ``` 4. **启动流程实例**: 使用`runtimeService.startProcessInstanceByKey()`方法启动流程实例,传入流程定义的关键字。 5. **参与任务**: 如果流程中包含用户任务,流程参与者可以通过API或UI获取任务并完成它们。 6. **监听和操作**: 可以监听流程实例的状态变化,比如使用`HistoricTaskService`进行任务查询、完成、取消等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_lrs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值