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

RabbitMQ高级特性 - 事务消息

文章目录

  • RabbitMQ 事务消息
    • 概述
    • 实现原理
    • 代码实现
      • 不采用事务
      • 采用事务

RabbitMQ 事务消息


概述

RabbitMQ 的 AMQP 协议实现了事务机制,允许开发者保证消息的发送和接收时原子性的,也就是说,要么消息全都发送成功,要么全都发送失败(只与发送方有关).

实现原理

AMQP 事务实现类似于传统数据库事务,允许在一个事务中发送多条消息,并在最后提交或回滚.

  • 事务开始:客户端发送 tx.select 方法,RabbitMQ 开启一个新的事务上下文.
  • 事务内的操作:客户端发送消息 basic.publish,RabbitMQ 将这些消息暂存在内存中,并标记为未提交.
  • 事务提交:客户端发送 tx.commit 方法,RabbitMQ 将所有暂存的消息写入队列,并且如果消息标记为持久化,那么就把消息保存到磁盘.
  • 事务回滚:客户端发送 tx.rollback 方法,RabbitMQ 丢弃所有暂存的消息,不会写入队列.

代码实现

不采用事务

a)配置文件

spring:application:name: rabbitmqrabbitmq:host: env-baseport: 5672username: rootpassword: 1111

b)配置常量

object MQConst {// 事务const val TRANS_QUEUE = "trans.queue"}

c)定义队列

@Configuration
class MQConfig {@Beanfun transQueue() = Queue(MQConst.TRANS_QUEUE)}

d)发送接口
两条消息之间故意触发异常.

@RestController
@RequestMapping("/mq")
class MQApi(val rabbitTemplate: RabbitTemplate,
) {@RequestMapping("/trans-close")fun transClose(): String {rabbitTemplate.convertAndSend("", MQConst.TRANS_QUEUE, "trans msg 1")//触发异常val a = 1 / 0rabbitTemplate.convertAndSend("", MQConst.TRANS_QUEUE, "trans msg 1")return "ok"}}

e)效果如下:
此时队列中只有一条消息,说明消息不具备事务特性.
在这里插入图片描述
在这里插入图片描述

采用事务

a)配置两个 Bean

  1. 由于事务对整个 RabbitTemplate 都会有影响,因此这里重新定义一个 Template bean.
  2. 还需要配置一个 RabbitMQ事务管理器.
@Configuration
class GlobalConfig {@Bean("transRabbitTemplate")fun transRabbitTemplate(connectionFactory: ConnectionFactory): RabbitTemplate {val mq = RabbitTemplate(connectionFactory)mq.isChannelTransacted = true // 开启事务机制return mq}@Beanfun rabbitTransactionManager(connectionFactory: ConnectionFactory): RabbitTransactionManager {return RabbitTransactionManager(connectionFactory)}}

b)如下步骤:

  • 使用新定义的事务 mq bean.
  • 在方法上加上 @Transaction 注解.
@RestController
@RequestMapping("/mq")
class MQApi(val transRabbitTemplate: RabbitTemplate,
) {@Transactional@RequestMapping("/trans-open")fun transOpen(): String {transRabbitTemplate.convertAndSend("", MQConst.TRANS_QUEUE, "trans msg 1")//触发异常val a = 1 / 0transRabbitTemplate.convertAndSend("", MQConst.TRANS_QUEUE, "trans msg 1")return "ok"}}

c)效果演示
在这里插入图片描述

在这里插入图片描述

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

相关文章:

  • leetcode:心算挑战
  • docker部署java项目(war包方式)
  • jsp 自定义taglib
  • 从一到无穷大 #32 TimeCloth,云上的快速 Point-in-Time Recovery
  • 时间序列论文1——Forecasting at Scale
  • HDFS常用命令
  • 请问如何做好软件测试工作呢?
  • 单片机开发与Linux开发的区别
  • 【机器学习】回归类算法-相关性分析
  • java基础 之 集合与栈的使用(三)
  • JDK-java.nio包详解
  • 虚拟机与服务器的区别是什么?虚拟机与服务器的区别和联系
  • Linux CentOS stream9 命令
  • JavaScript基础——JavaScript变量声明
  • ModuleNotFoundError: No Module Named openai
  • 基于SpringBoot+Vue的校园便利平台(带1w+文档)
  • 串口应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
  • Canvas实现截图
  • Python高性能计算:进程、线程、协程、并发、并行、同步、异步
  • kafka基本操作
  • JavaFX布局-Accordion
  • 【轨物方案】评估光伏组件发电性能一致性方案
  • 安全基础学习-keil调试汇编代码
  • Unity复制对象时让私有变量也被复制的简单方法
  • Flink 实时数仓(二)【DIM 层搭建】
  • 知识图谱开启了一个可以理解的人工智能未来
  • 借助Aspose.html控件, 将SVG 转PNG 的 C# 图像处理库
  • vs-2015安装教程
  • Stable Diffusion绘画 | 文生图设置详解—随机种子数(Seed)
  • 56、php实现N的阶乘末尾有多个0