1. 概述
在之前的Activiti与Java入门文章中,我们了解了ProcessEngine的重要性,并通过框架提供的默认静态API创建了一个实例。除了默认方式,还有其他创建ProcessEngine的方法——本文将深入探讨这些方案。
2. 获取ProcessEngine实例
获取ProcessEngine实例有两种主要方式:
- 使用ProcessEngines类
- 通过ProcessEngineConfiguration编程式创建
下面我们详细分析这两种方式的实现示例。
3. 使用ProcessEngines类获取ProcessEngine
通常,ProcessEngine通过名为activiti.cfg.xml的XML文件配置,这也是默认创建过程使用的配置文件。
以下是典型配置示例:
<beans xmlns="...">
<bean id="processEngineConfiguration" class=
"org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl"
value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
⚠️ 注意这里配置了引擎的持久化相关参数。
获取ProcessEngine的代码非常简单:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
4. 使用ProcessEngineConfiguration获取ProcessEngine
除了默认方式,创建ProcessEngineConfiguration有两种途径:
- 使用XML配置
- 使用Java配置
4.1 XML配置方式
如第2节所述,我们可以编程式定义ProcessEngineConfiguration,并通过该实例构建ProcessEngine:
@Test
public void givenXMLConfig_whenCreateDefaultConfiguration_thenGotProcessEngine() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault();
ProcessEngine processEngine
= processEngineConfiguration.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("root", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
方法createProcessEngineConfigurationFromResourceDefault()
会自动查找activiti.cfg.xml文件,我们只需调用buildProcessEngine()
即可。
默认情况下,它会查找名为processEngineConfiguration
的bean。如果需要修改配置文件名或bean名,可以使用其他API方法:
修改配置文件名示例
@Test
public void givenDifferentNameXMLConfig_whenGetProcessEngineConfig_thenGotResult() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource(
"my.activiti.cfg.xml");
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("baeldung", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
同时修改文件名和bean名示例
@Test
public void givenDifferentBeanNameInXMLConfig_whenGetProcessEngineConfig_thenGotResult() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource(
"my.activiti.cfg.xml",
"myProcessEngineConfiguration");
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("baeldung", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
✅ 运行测试前需确保配置文件名和bean名与代码一致。
其他可用方法包括:
createProcessEngineConfigurationFromInputStream(InputStream inputStream)
createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName)
4.2 Java配置方式
如果不想用XML配置,可以完全使用Java配置。Activiti提供了四种配置类,对应不同环境:
StandaloneProcessEngineConfiguration
– 独立模式,使用数据库持久化StandaloneInMemProcessEngineConfiguration
– 默认使用H2内存数据库,引擎启动时创建DB,关闭时销毁(适合测试)SpringProcessEngineConfiguration
– Spring环境专用JtaProcessEngineConfiguration
– 独立模式+JTA事务
来看几个实际例子:
独立模式配置示例
@Test
public void givenNoXMLConfig_whenCreateProcessEngineConfig_thenCreated() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration();
ProcessEngine processEngine = processEngineConfiguration
.setDatabaseSchemaUpdate(ProcessEngineConfiguration
.DB_SCHEMA_UPDATE_TRUE)
.setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("sa", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
内存数据库配置示例
@Test
public void givenNoXMLConfig_whenCreateInMemProcessEngineConfig_thenCreated() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("sa", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
5. 数据库配置
默认情况下,Activiti使用H2内存数据库,数据库名为"activiti",用户名为"sa"。如需使用其他数据库,需显式配置两个核心属性:
databaseType
:有效值包括h2, mysql, oracle, postgres, mssql, db2
(通常可自动检测,但手动配置更可靠)databaseSchemaUpdate
:控制引擎启动/关闭时的数据库行为,可选值:false
(默认):仅验证数据库版本与库匹配,不匹配则抛异常true
:启动时检查并创建/更新数据库结构"create-drop"
:引擎启动时创建DB,关闭时销毁
JDBC属性配置示例
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
<property name="databaseType" value="mysql" />
DataSource配置示例
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/activiti" />
<property name="username" value="activiti" />
<property name="password" value="activiti" />
<property name="defaultAutoCommit" value="false" />
<property name="databaseType" value="mysql" />
</bean>
⚠️ 踩坑提醒:生产环境务必使用连接池(如上述DataSource配置),避免直接使用JDBC属性。
6. 总结
本文深入探讨了Activiti中创建ProcessEngine的多种方式,包括:
- 基于XML的配置方案
- 纯Java配置方案
- 数据库配置的最佳实践
这些配置方式各有适用场景,选择时需结合项目需求和环境特点。完整示例代码可在GitHub仓库中获取。