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

相关推荐
麦兜*2 分钟前
Spring Boot 与 Ollama 集成部署私有LLM服务 的完整避坑指南,涵盖 环境配置、模型管理、性能优化 和 安全加固
java·spring boot·后端·安全·spring cloud·性能优化
老四敲代码3 分钟前
Spark 机器学习提速指南
大数据·分布式·spark
leo__5206 分钟前
Java的NIO体系详解
java·python·nio
烟沙九洲6 分钟前
服务之间远程Feign调用,出现参数丢失
java·spring boot
Yang-Never9 分钟前
Kotlin协程 ->launch构建协程以及调度源码详解
android·java·开发语言·kotlin·android studio
极客BIM工作室12 分钟前
C++返回值优化(RVO):高效返回对象的艺术
java·开发语言·c++
用户849137175471613 分钟前
JustAuth实战系列(第1期):项目概览与价值分析
java·架构·开源
埃泽漫笔27 分钟前
BeanFactory 和 ApplicationContext 的区别?
spring
自由的疯33 分钟前
Java 17 新特性之 instanceof 运算符
java·后端·架构
自由的疯36 分钟前
Java 17 新特性之 Switch 表达式改进
java·后端·架构