跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

RabbitMQ 事务机制详解:Spring AMQP 配置与问题排查

综述由AI生成RabbitMQ 基于 AMQP 协议实现事务机制,确保消息发送和接收的原子性。在 Spring AMQP 中,仅设置 RabbitTemplate 为通道事务模式不足以实现完整的事务回滚,必须配置 RabbitTransactionManager。通过代码示例演示了未配置事务管理器导致异常时部分消息已入队的问题,以及添加事务管理器后异常回滚的正确行为,帮助开发者避免分布式事务中的数据不一致风险。

猫巷少女发布于 2026/2/7更新于 2026/6/327 浏览
RabbitMQ 事务机制详解:Spring AMQP 配置与问题排查

事务

RabbitMQ 是基于 AMQP 协议实现的,该协议实现了事务机制,因此 RabbitMQ 也支持事务机制。Spring AMQP 也提供了对事务相关的操作。RabbitMQ 事务允许开发者确保消息的发送和接收是原⼦性的,要么全部成功,要么全部失败。

添加配置

spring:
  application:
    name: rabbit-extensions-demo
  rabbitmq:
    addresses: amqp://study:[email protected]:5672/extension

常量类

public class Constants {
    // 事务队列名称
    public static final String TRANS_QUEUE = "trans.queue";
}

声明队列

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import rabbitextensionsdemo.constant.Constants;

@Configuration
public class RabbitMQConfig {
    @Bean("transQueue")
    public Queue transQueue() {
        return QueueBuilder.durable(Constants.TRANS_QUEUE).build();
    }
}

设置 RabbitTemplate

import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitTemplateConfig {
    @Bean("transRabbitTemplate")
    public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setChannelTransacted(true); // 开启事务
        return rabbitTemplate;
    }
}

编写生产消息代码 1

@Transactional
@RequestMapping("/trans")
public String trans() {
    transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans test 1...");
    transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans test 2...");
    return "消息发送成功";
}
观察效果

消息入队

消息入队详情

此时我们可以看到,两条消息都进入了队列。

编写生产消息代码 2

@Transactional
@RequestMapping("/trans")
public String trans() {
    transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans test 1...");
    int num = 5 / 0; // 模拟异常
    transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans test 2...");
    return "消息发送成功";
}
观察效果

异常堆栈

队列状态

消息内容

此时我们发现,抛异常了,但是队列中居然有 1 条消息,怎么回事?我们不是开启事务了吗?

原因是因为我们没有配置事务管理器。

配置事务管理器

import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.transaction.RabbitTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitTemplateConfig {
    @Bean("transRabbitTemplate")
    public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setChannelTransacted(true); // 开启事务
        return rabbitTemplate;
    }

    @Bean
    public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory) {
        return new RabbitTransactionManager(connectionFactory);
    }
}
观察效果

异常回滚

队列清空

最终结果

此时我们可以看到,生产消息时抛异常了,因为开启了事务,所以生产的消息没有入队列,且结果符合预期。

目录

  1. 事务
  2. 添加配置
  3. 常量类
  4. 声明队列
  5. 设置 RabbitTemplate
  6. 编写生产消息代码 1
  7. 观察效果
  8. 编写生产消息代码 2
  9. 观察效果
  10. 配置事务管理器
  11. 观察效果
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ASP.NET WebForms 中的 SortedList 核心用法与注意事项
  • Qwen3-4B-Instruct 本地部署与 AI 写作实战指南
  • SnapDOM + jsPDF 高保真 HTML 转 PDF 实践指南
  • 企业级高性能 Web 服务器:Nginx 核心架构与实战配置
  • Python 编程练习题 171-180
  • Spring Boot 数据导入导出与报表生成实战
  • 算法思想精练:贪心、二分、正难则反及背包问题
  • 浏览器端 HTML 转 Word 文档的完整解决方案
  • OpenClaw 大龙虾机器人安装与配置教程
  • 基于 SpringBoot、Vue 与 Netty 的 WebRTC 视频聊天实战
  • 2026 年十大 AI 编程工具推荐
  • OSCP 实战笔记:获取并破解 Net-NTLMv2 哈希(下)
  • 从裸金属到实时系统:C++内核稳定运行的关键控制点
  • 位运算算法实战:判断字符唯一、丢失数字与两数之和等题目解析
  • Flutter 实现小程序混合 App 的开发实践
  • 大模型辅助爬虫数据提取实践与职业影响分析
  • Web 可访问性最佳实践:确保所有用户平等访问
  • 大模型应用开发中的高级 RAG 技术详解
  • FastDFS 分布式存储系统入门详解
  • 6 款主流国产大模型功能对比与使用指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online