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 队列中没有消息存在。

相关推荐
代码栈上的思考10 小时前
SpringBoot 拦截器
java·spring boot·spring
送秋三十五10 小时前
一次大文件处理性能优化实录————Java 优化过程
java·开发语言·性能优化
雨中飘荡的记忆10 小时前
千万级数据秒级对账!银行日终批处理对账系统从理论到实战
java
jbtianci10 小时前
Spring Boot管理用户数据
java·spring boot·后端
Sylvia-girl10 小时前
线程池~~
java·开发语言
魔力军10 小时前
Rust学习Day3: 3个小demo实现
java·学习·rust
时艰.10 小时前
java性能调优 — 高并发缓存一致性
java·开发语言·缓存
落花流水 丶10 小时前
Java 多线程完全指南
java
那我掉的头发算什么10 小时前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
jxy999810 小时前
mac mini 安装java JDK 17
java·开发语言·macos