RabbitMQ 高级特性之事务

1. 简介

与 MySQL、Redis 一样,RabbitMQ 也支持事务。事务中的消息,要么全都发送成功,要么全部发送失败,不会出现一部分成功一部分失败的情况。

2. 使用事务发送消息

spring 中使用 RabbitMQ 开启事务需要两步:

第一步:配置 RabbitTemplate

使用下面这段代码,将 RabbitTemplate 的 transactional 设置为 true:

java 复制代码
    @Bean("transRabbitTemplate")
    public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);

        rabbitTemplate.setChannelTransacted(true);

        return rabbitTemplate;
    }

第二步:在使用 @Transactional注解:

java 复制代码
    @Transactional //开启事务
    @RequestMapping("/trans")
    public String trans() {
        transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans 1");
        transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans 2");
        int num = 3 / 0;
        transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans 3");

        return "消息发送成功";
    }

在上面的代码中,存在一处异常,当运行程序后,由于使用了事务,那么这三条消息应该都不会进入队列中。

代码运行结果如下:

可以看到,trans.queue 队列中没有消息存在。

相关推荐
nanxun88621 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103511 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师1 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师1 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 天前
mac(m5)平台编译openjdk
java
唐青枫2 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马2 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261352 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261352 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454753 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程