【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注解,再调用接口

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


相关推荐
lifallen2 分钟前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
长安不见3 分钟前
背景知识: 理解LimitLatch背后的AQS
java
小吕学编程6 分钟前
策略模式实战:Spring中动态选择商品处理策略的实现
java·开发语言·设计模式
weixin_4383354012 分钟前
Spring Boot实现接口时间戳鉴权
java·spring boot·后端
pan_junbiao44 分钟前
Spring框架的设计模式
java·spring·设计模式
远方16091 小时前
0x-2-Oracle Linux 9上安装JDK配置环境变量
java·linux·oracle
北执南念1 小时前
CompletableFuture+线程池使用案列
java
黄交大彭于晏1 小时前
发送文件脚本源码版本
java·linux·windows
钮钴禄·爱因斯晨1 小时前
Java 面向对象进阶之多态:从概念到实践的深度解析
java·开发语言·数据结构
鸽子炖汤2 小时前
Java中==和equals的区别
java·开发语言·jvm