Activiti配置
Activiti设计的配置相关的类继承关系如下图(Activiti6.0),核心的配置是最上层的抽象类ProcessEngineConfiguration
,本文也是主要分析的这个抽象类。
分析ProcessEngineConfiguration主要从下面几个点进行解读:
- 创建
ProcessEngineConfiguration
对象; - 创建
processEngine
流程引擎对象; - 一些重要的配置;
创建ProcessEngineConfiguration
对象
ProcessEngineConfiguration
提供了7种静态方法去获取ProcessEngineConfiguration
流程引擎配置对象,inputstream的
方式基本不用,我们看看default、resource和StandaloneInMem这三种构造方式。
-
default
return createProcessEngineConfigurationFromResource("activiti.cfg.xml", "processEngineConfiguration");
默认的这个方式,其实也是通过resource的方式去创建,指定了文件名和bean名。
-
resource
resource提供了几种重载的方式,最后都调用同一个方法,
BeansConfigurationHelper.parseProcessEngineConfigurationFromResource(resource, beanName);
进去看这个源码,发现这个就是基于Spring的方式去解析资源文件,并通过
getBean
的方式去获取到了ProcessEngineConfiguration对象。public class BeansConfigurationHelper { public static ProcessEngineConfiguration parseProcessEngineConfiguration(Resource springResource, String beanName) { //beanFactory DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);//xmlBeanDefinitionReader xmlBeanDefinitionReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_XSD); xmlBeanDefinitionReader.loadBeanDefinitions(springResource); ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) beanFactory.getBean(beanName);//getBean获取对象 processEngineConfiguration.setBeans(new SpringBeanFactoryProxyMap(beanFactory)); return processEngineConfiguration; } }
-
StandaloneInMem
该构造方法是
return new StandaloneInMemProcessEngineConfiguration();
,StandaloneInMemProcessEngineConfiguration
的继承关系如下图,其构造方法如下,跟踪源码最后调用了ProcessEngineConfiguration
的无参构造方法,只是在构造完成之后,有设置了数据库为h2内存数据库,并设置了databaseSchemaUpdate=DB_SCHEMA_UPDATE_CREATE_DROP
。
public StandaloneInMemProcessEngineConfiguration() {
this.databaseSchemaUpdate = DB_SCHEMA_UPDATE_CREATE_DROP;
this.jdbcUrl = "jdbc:h2:mem:activiti";
}
创建processEngine
流程引擎对象
ProcessEngineConfiguration创建processEngine对象的方法是buildProcessEngine,但在ProcessEngineConfiguration是一个抽象类,具体的实现在其子类ProcessEngineConfigurationImpl中。
@Override
public ProcessEngine buildProcessEngine() {
init(); //init方法 重要的初始化方法
ProcessEngineImpl processEngine = new ProcessEngineImpl(this);
// trigger build of Activiti 5 Engine
if (isActiviti5CompatibilityEnabled && activiti5CompatibilityHandler != null) {
Context.setProcessEngineConfiguration(processEngine.getProcessEngineConfiguration());
activiti5CompatibilityHandler.getRawProcessEngine();
}
postProcessEngineInitialisation();
return processEngine;
}
其中init方法中涉及了许多初始化的工作,包括(以下部分内容):
- 初始化所有的配置对象 initConfigurators
- init前置方法 configuratorsBeforeInit
- 初始化图形解析器 initProcessDiagramGenerator
- 初始化历史等级 initHistoryLevel
- 初始化bean initBeans
- 初始化form引擎、service
- init后置方法 configuratorsAfterInit
在init方法执行之后,就会new ProcessEngineImpl(this)
来new一个ProcessEngineImpl对象,这样就获取到了一个看ProcessEngineImpl对象。跟踪ProcessEngineImpl的构造方法,对ProcessEngineImpl的一系列service等进行了赋值,也就是基于配置对这些Service进行了创建,后面调用的时候就可以通过processEngine.getXXService
来使用了。
一些重要的配置
- DB_SCHEMA_UPDATE设置
有三个值
- false:启动时检查数据库版本,不匹配抛异常(生成环境)
- true:启动时检查,并进行更新(开发环境)
- Create-drop:启动时创建数据库表,结束时删除(demo)
-
数据库和连接池
Activiti默认使用H2内存数据库(H2数据库是纯java写的,只有一个jar包,多用于嵌入式)。也支持mysql、oracle、db2等。Activiti中processEngineConfigurationImpl的init方法有一个initDataSource的方法,该方法会进行数据库的初始化操作,主要是 jdbcUrl、jdbcDriver、jdbcUsername、jdbcPassword等,并设置了最大连接数、空闲连接数等参数。
连接池默认是用mybatis的连接池,但是生成一般不用,性能差,Activiti支持dataSource和jdbc形式的数据库连接池,包括druid、dbcp、hikariCP等。