当前位置: 首页 > news >正文

RabbitMQ 高级特性——事务

在这里插入图片描述

文章目录

  • 前言
  • 事务
    • 配置事务管理器
    • 加上@Transactional注解

前言

前面我们学习了 RabbitMQ 的延迟队列,通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。

事务

RabbitMQ 是基于 AMQP 协议实现的,该协议实现了事务机制,因此 RabbitMQ 也支持事务机制。Spring AMQP 也提供了对事务相关的操作。RabbitMQ 事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败。然而,需要明确的是,RabbitMQ 的事务支持主要集中在生产者(发送方)端,并且它可能不是处理高并发场景下的最佳实践,因为使用事务会增加消息发送的延迟和复杂性。

那么我们来看看在 Spring 中如何实现 RabbitMQ 事务。

先来看看在没有事务的情况下是否能够保证消息发送的原子性:

public static final String TRANS_EXCHANGE = "trans.exchange";
public static final String TRANS_QUEUE = "trans.queue";

声明交换机、队列和绑定关系:

@Configuration
public class TransConfig {@Bean("transExchange")public Exchange transExchange() {return ExchangeBuilder.directExchange(Constants.TRANS_EXCHANGE).build();}@Bean("transQueue")public Queue transQueue() {return QueueBuilder.durable(Constants.TRANS_QUEUE).build();}@Bean("transBinding")public Binding transBinding(@Qualifier("transExchange") Exchange exchange, @Qualifier("transQueue") Queue queue) {return BindingBuilder.bind(queue).to(exchange).with("trans").noargs();}
}

消费者代码:

@RequestMapping("/trans")
public String trans() {rabbitTemplate.convertAndSend(Constants.TRANS_EXCHANGE,"trans","rabbitmq trans1");//制造异常int ret = 3/0;rabbitTemplate.convertAndSend(Constants.TRANS_EXCHANGE,"trans","rabbitmq trans2");return "消息发送成功";
}

这里就不指定消费者了,只是看看事务的效果。

在这里插入图片描述
观察队列的情况:

在这里插入图片描述
可以发现此时消息的发送是不具备原子性的,所以我们就使用事务保证消息的原子性。

配置事务管理器

@Configuration
public class TransConfig {@Bean("transactionManager")public RabbitTransactionManager transactionManager(ConnectionFactory factory) {return new RabbitTransactionManager(factory);}@Bean("transactionRabbitTemplate")public RabbitTemplate transactionRabbitTemplate(ConnectionFactory factory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(factory);rabbitTemplate.setChannelTransacted(true);return rabbitTemplate;}
}

加上@Transactional注解

配置完成事务管理器之后,我们需要在需要开启事务的方法上加上 @Transactional 注解:

@RequestMapping("producer")
@RestController
public class ProducerController {@Autowiredprivate RabbitTemplate rabbitTemplate;@Resource(name = "transactionRabbitTemplate")private RabbitTemplate transactionRabbitTemplate;@Transactional@RequestMapping("/trans")public String trans() {transactionRabbitTemplate.convertAndSend(Constants.TRANS_EXCHANGE,"trans","rabbitmq trans1");//制造异常int ret = 3/0;transactionRabbitTemplate.convertAndSend(Constants.TRANS_EXCHANGE,"trans","rabbitmq trans2");return "消息发送成功";}
}

在这里插入图片描述
上面就是 RabbitMQ 事务的使用。

http://www.lryc.cn/news/472756.html

相关文章:

  • HCIP-HarmonyOS Application Developer V1.0 笔记(二)
  • 初体验鸿蒙 HarmonyOS NEXT开发
  • MySQL---主从复制和读写分离
  • Apache Kyuubi概述——网易数帆(网易杭州研究院)开源
  • 前端代码注释
  • Linux线程安全(二)条件变量实现线程同步
  • Linux初阶——线程(Part2):互斥同步问题
  • 力扣——二叉树的后序遍历(C语言)
  • 利用kimi编程助手从0到1开始搭建小程序!
  • WSL(Ubuntu20.04)编译和安装DPDK
  • HLS协议之nginx-hls-多码率测试环境搭建
  • 函数式接口与回调函数实践
  • Windows11系统如何使用自带的录音、录屏工具?
  • 使用 web (vue 和DRF))实现 模拟一个IDE 功能思路
  • 智航船舶租赁综合管理系统
  • 统信UOS下启动图形界面应用工具monitor报JAVA相关错:An error has occurred. See the log file
  • N-154基于springboot酒店预订管理系统
  • 微信小程序如何实现地图轨迹回放?
  • vscode的一些使用心得
  • Python金色流星雨(完整代码)
  • [山河CTF 2024] week3
  • Java集合常见面试题总结(5)
  • 牛客网刷题(3)(Java的几种常用包)
  • PyTorch nn.Conv2d 空洞卷积
  • 像素、分辨率、PPI(像素密度)、帧率的概念
  • 两步GMM计算权重矩阵
  • leetcode452. 用最少数量的箭引爆气球
  • 【Android】使用TextView实现按钮开关代替Switch开关
  • (49)MATLAB实现迫零均衡器原理与代码
  • 滚柱导轨出现异常损坏的原因