Spring MVC 与 Activiti 5.22 集成中的事务整合配置实践
问题背景
在一次日常维护中,有用户反馈其审批任务未出现在待办列表中,但流程记录显示已分配至该用户。排查过程中,服务端日志揭示了关键线索:业务逻辑抛出了异常,但流程仍继续执行,并未因 @Transactional 注解回滚。这表明当前的流程引擎未与 Spring 的事务管理机制联动。问题根源在于使用了默认的流程引擎初始化方式,导致 Activiti 独立于 Spring 容器之外运行。为解决此问题,必须将 Activiti 深度集成进 Spring 上下文中,实现事务一致性控制。
核心思路
传统的 ProcessEngines.getDefaultProcessEngine() 方式虽然便捷,但无法参与 Spring 的声明式事务管理。正确做法是通过 Spring 容器来创建和管理 ProcessEngine 实例,使其内部的操作能被 Spring 的事务切面所拦截,从而确保业务数据与流程状态的一致性。
Maven 依赖配置
引入 activiti-spring 模块以支持与 Spring 的集成。由于高版本 Spring 项目可能存在兼容性冲突,需排除低版本的 spring-context 依赖:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.22.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
Spring 配置文件详解
以下为完整的 Spring Bean 配置,涵盖数据源、流程引擎及各项服务的注入:
<!-- 数据源配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/your_db"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 自定义 ID 生成策略(可选)-->
<bean id="uuidGenerator" class="org.activiti.engine.impl.persistence.StrongUuidGenerator"/>
<!-- 流程引擎配置对象 -->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="databaseSchemaUpdate" value="false"/>
<property name="idGenerator" ref="uuidGenerator"/>
</bean>
<!-- 流程引擎工厂 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
<!-- 各项流程服务接口 -->
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>
使用方式
完成上述配置后,即可在任意 Spring 管理的组件中通过 @Autowired 注入所需的 Activiti 服务:
@Service
public class WorkflowService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Transactional
public void startProcess(String businessKey) {
// 此处操作将受事务控制
runtimeService.startProcessInstanceByKey("testProcess", businessKey);
// 若后续代码抛出异常,流程启动也将回滚
}
}
通过以上配置,Activiti 的所有数据库操作均纳入 Spring 事务管理范畴,确保了业务逻辑与流程流转的原子性与一致性。