1. 概述

在之前的Activiti与Java入门文章中,我们了解了ProcessEngine的重要性,并通过框架提供的默认静态API创建了一个实例。除了默认方式,还有其他创建ProcessEngine的方法——本文将深入探讨这些方案。

2. 获取ProcessEngine实例

获取ProcessEngine实例有两种主要方式:

  1. 使用ProcessEngines
  2. 通过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有两种途径:

  1. 使用XML配置
  2. 使用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提供了四种配置类,对应不同环境:

  1. StandaloneProcessEngineConfiguration – 独立模式,使用数据库持久化
  2. StandaloneInMemProcessEngineConfiguration – 默认使用H2内存数据库,引擎启动时创建DB,关闭时销毁(适合测试)
  3. SpringProcessEngineConfiguration – Spring环境专用
  4. 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:控制引擎启动/关闭时的数据库行为,可选值:
    1. false(默认):仅验证数据库版本与库匹配,不匹配则抛异常
    2. true:启动时检查并创建/更新数据库结构
    3. "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仓库中获取。


原始标题:ProcessEngine Configuration in Activiti | Baeldung