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

相关推荐
wszy18091 小时前
外部链接跳转:从 App 打开浏览器的正确姿势
java·javascript·react native·react.js·harmonyos
期待のcode1 小时前
认识Java虚拟机
java·开发语言·jvm
raining_peidx1 小时前
xxljob源码
java·开发语言
肥猪猪爸1 小时前
双重检查锁(DCL)与 volatile 的关键作用
java·开发语言·单例模式
yaoxin5211231 小时前
289. Java Stream API - 从字符串的字符创建 Stream
java·开发语言
浮游本尊1 小时前
Java学习第35天 - 分布式系统深入与大数据处理
java
2301_780669861 小时前
Set集合、HashSet集合的底层原理
java
你曾经是少年2 小时前
Java 关键字
java
海南java第二人2 小时前
SpringBoot启动流程深度解析:从入口到容器就绪的完整机制
java·开发语言
问今域中2 小时前
Spring Boot 请求参数绑定注解
java·spring boot·后端