【RabbitMQ】事务

事务的简单配置及使用

RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.

SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败.

配置事务管理器

java 复制代码
@Configuration
public class RabbitTemplateConfig {
   

    //事务
    @Bean("transRabbitTemplate")
    public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory){
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        //设置setChannelTransacted为true
        rabbitTemplate.setChannelTransacted(true);  
        return rabbitTemplate;
    }

    //配置事务管理器
    @Bean
    public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory){
        return new RabbitTransactionManager(connectionFactory);
    }



}

声明队列

java 复制代码
@Configuration
public class RabbitMQConfig {
    @Bean("transQueue")
    public Queue transQueue(){
        return QueueBuilder.durable(Constant.TRANS_QUEUE).build();
    }
}

生产者代码

java 复制代码
@RestController
@RequestMapping("/producer")
public class ProducerController {

    @Resource(name = "transRabbitTemplate")
    private RabbitTemplate transRabbitTemplate;

    @Transactional
    @RequestMapping("/trans")
    public String trans(){
        //1. rabbitTemplate.setChannelTransacted(true);设置事务属性为true
        //2. 开启@Transactional注解
        //3. RabbitTransactionManager
        System.out.println("trans test...");
        transRabbitTemplate.convertAndSend("",Constant.TRANS_QUEUE, "trans test 1...");
        int num = 5/0;
        transRabbitTemplate.convertAndSend("",Constant.TRANS_QUEUE, "trans test 2...");
        return "消息发送成功";
    }
    
}

测试

下面基于我们编写的代码来进行一下简单的测试

@Transactional注解和不加@Transactional注解

我们先把注解屏蔽掉调用接口

此时再看看我们RabbitMQ的管理界面,可以看到第一条消息发送成功了

把消息删掉再加上@Transactional注解,再调用接口

可以看到此时我们的队列里就不会收到消息了


相关推荐
IT乐手5 分钟前
Java 实现异步转同步的方法
java
杨杨杨大侠5 分钟前
附录 1:🚀 Maven Central 发布完整指南:从零到成功部署
java·github·maven
Rysxt_11 分钟前
Spring Boot Gateway 教程:从入门到精通
spring boot·网关·gateway
草履虫建模24 分钟前
在 RuoYi 中接入 3D「园区驾驶舱」:Vue2 + Three.js + Nginx
运维·开发语言·javascript·spring boot·nginx·spring cloud·微服务
渣哥27 分钟前
Java HashMap 扩容机制详解:触发条件与实现原理
java
赵星星52027 分钟前
Spring Bean线程安全陷阱:90%程序员都会踩的坑,你中招了吗?
java
Barcke34 分钟前
📘 初识 WebFlux
spring boot·后端·spring
得物技术1 小时前
0基础带你精通Java对象序列化--以Hessian为例|得物技术
java·后端·编程语言
橘子在努力1 小时前
【橘子SpringCloud】OpenFegin源码分析
java·spring boot·spring·spring cloud
我是廖志伟1 小时前
JVM新生代Eden区域深度解析
java·jvm·memory management