当前位置:首页 > 技术 > 正文内容

Spring MVC 与 Activiti 5.22 集成中的事务整合配置实践

访客 技术 2026年6月15日 1

问题背景

在一次日常维护中,有用户反馈其审批任务未出现在待办列表中,但流程记录显示已分配至该用户。排查过程中,服务端日志揭示了关键线索:业务逻辑抛出了异常,但流程仍继续执行,并未因 @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 事务管理范畴,确保了业务逻辑与流程流转的原子性与一致性。

标签: Spring MVC

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。