RabbitMQ高级特性 - 事务消息

news2024/9/21 4:33:42

文章目录

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

RabbitMQ 事务消息


概述

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

实现原理

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

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

代码实现

不采用事务

a)配置文件

spring:
  application:
    name: rabbitmq
  rabbitmq:
    host: env-base
    port: 5672
    username: root
    password: 1111

b)配置常量

object MQConst {

    // 事务
    const val TRANS_QUEUE = "trans.queue"

}

c)定义队列

@Configuration
class MQConfig {

    @Bean
    fun 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 / 0
        rabbitTemplate.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
    }

    @Bean
    fun 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 / 0
        transRabbitTemplate.convertAndSend("", MQConst.TRANS_QUEUE, "trans msg 1")
        return "ok"
    }

}

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《python语言程序设计》2018版第6章第27题双素数是指一堆差值为2的素数。

水平的原因做不到答案那种输出 def is_prime(number):divisor 2while divisor < number / 2:if number % divisor 0:return Falsedivisor 1return Truedef print_prime_numbers(number_of_primes):count 0number 2while number < number_of_primes:if is_prime(numb…

六、GD32 MCU 选项字节设置及解除方法

您在使用GD32过程中是否遇到过芯片反复复位&#xff0c;代码无法更新&#xff0c;代码一直执行在0x1fffxxxx区域&#xff0c;或代码执行在SRAM区域的情况&#xff1f;如果有遇到这类现象是否找到原因呢&#xff1f;如果没找到是否检查过选项字节是否正常呢&#xff1f;这一章节…

C++ | 类和对象(下)(static成员、友元、内部类、匿名对象)

目录 ​编辑 static成员 static性质简介 static属于整个类&#xff0c;属于所有对象 static成员的声明与定义 static函数 友元friend 友元特性简介 友元关系讲解 内部类 特性一 特性二 匿名对象 结语 static成员 static性质简介 static成员在类里面是非常独特的…

ContentProvider的相关知识总结

1.ContentProvider概念讲解&#xff1a; 2.使用系统提供的ContentProvider 其实很多时候我们用到ContentProvider并不是自己暴露自己的数据&#xff0c;更多的时候通过 ContentResolver来读取其他应用的信息&#xff0c;最常用的莫过于读取系统APP&#xff0c;信息&#xff0c…

Kubernetes中的CRI、CNI与CSI:深入理解云原生存储、网络与容器运行时

引言 随着云原生技术的飞速发展&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;作为云原生应用的核心调度平台&#xff0c;其重要性日益凸显。K8s通过开放一系列接口&#xff0c;实现了高度的可扩展性和灵活性&#xff0c;其中CRI&#xff08;Container Runtime Inter…

使用归一化连接计数的胸部CT成像:预测CanCOLD研究中的肺气肿进展| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 CT Chest Imaging Using Normalized Join-Count: Predicting Emphysema Progression in the CanCOLD Study 使用归一化连接计数的胸部CT成像&#xff1a;预测CanCOLD研究中的肺气肿进展 Background 背景 Pre-existing emphysema is recognized as an indicator…

【C++】------继承(一)

目录 前言 一、概念与定义 Ⅰ、是什么&#xff1f; Ⅱ、定义 1.定义格式&#xff1a; 2.继承方式和访问限定符 3.基类&#xff08;父类&#xff09;成员访问方式的变化 二、父类与子类的赋值转化 基本认识 原理 三、 继承中的作用域 四、子类(派生类)的默认成员函…

Spring中是如何实现IoC和DI的?

前言&#xff1a;在前一篇文章中对于IoC的核心思想进行了讲解&#xff0c;而本篇文章则从Spring的角度入手&#xff0c;体会Spring对于IoC是如何实现的。 如果对IoC还有不太了解的可以阅读上一篇文章&#xff0c;相信一定会带来全新的收获&#xff1a;什么是IoC&#xff08;控制…

5.5软件工程-系统测试

系统测试 意义和目的原则测试过程测试策略测试方法练习题 测试用例设计黑盒测试等价类划分边界值分析错误推测因果图 白盒测试逻辑覆盖循环覆盖基本路径测试法 练习题 调试软件度量练习题 考点少&#xff0c;知识点多 意义和目的 系统测试的意义&#xff1a;系统测试是为了发现…

浅谈Redis集群架构与主从架构

目录 1. Redis集群1.1 集群概念1.2 集群分片1.3 重新分片 2. 集群的主从模型2.1 主从模型2.2 主节点选举 1. Redis集群 1.1 集群概念 面试官&#xff1a;我看你简历写了Redis集群&#xff0c;你说一说&#xff1f; Redis主从架构和Redis集群架构是两种不同的概念&#xff0c;大…

【Spring成神之路】从源码角度深度刨析Spring循环依赖

文章目录 一、引言二、循环依赖出现的场景2.1 有参构造导致的循环依赖问题2.2 属性注入出现的依赖问题2.3 Spring IOC创建Bean的流程2.4 有参构造为何失败2.5 属性注入为何能成功2.6 AOP导致的循环依赖 三、Spring循环依赖源码刨析四、Spring循环依赖案例刨析 一、引言 循环依…

【MATLAB源码】数学建模基础教程---初步认识数学建模

系列文章目录在最后面&#xff0c;各位同仁感兴趣可以看看&#xff01; 什么是数学建模 含义1.区分数学模型和数学建模2. 建立数学模型的注意事项3.数学建模流程图解4.数学建模模型分类5.论文常用套路6.最后&#xff1a;总结系列文章目录 含义 所谓数学建模&#xff0c;简言…

Python 中实现聊天客户端库

在 Python 中实现一个简单的聊天客户端库可以通过使用 socket 模块来处理网络通信。我们可以构建一个基于 TCP 的简单聊天系统&#xff0c;其中包括一个服务器和一个客户端。 1、问题背景 假设您正在尝试编写一个 Python 库&#xff0c;用于实现某个聊天协议的客户端。在连接…

c++入门基础(下篇)————引用、inline、nullptr

引用 引用的概念和定义 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名&#xff0c;编译器不会为引⽤变量开辟内存空间&#xff0c; 它和它引⽤的变量共⽤同⼀块内存空间。 类型& 引用别名 引用对象; 就像孙悟空也叫齐天大圣 猪八戒也叫天蓬元帅。…

正点原子imx6ull-mini-Linux驱动之Linux 自带的 LED 灯驱动实验(16)

前面我们都是自己编写 LED 灯驱动&#xff0c;其实像 LED 灯这样非常基础的设备驱动&#xff0c;Linux 内 核已经集成了。Linux 内核的 LED 灯驱动采用 platform 框架&#xff0c;因此我们只需要按照要求在设备 树文件中添加相应的 LED 节点即可&#xff0c;本章我们就来学习如…

Level3答案

突然发现&#xff0c;忘记公布了Level3答案&#xff1a; 1、 (1)heker.h HeiKe.h (2)Make_Text() (3)3 (4)heker.h 2、 (1)ArtText.h Maker_World.h (Maker_Game头文件组) (2)5.0 附加题、 我把标题截了张图&#xff01; 这是我们 Cookie Maker工作室 新出来的 “无标题技术”…

JavaScript基础——JavaScript数据及数据类型

JavaScript中数据的分类 数据是指设备、浏览器可以识别的内容。在JavaScript中&#xff0c;数据可分为基本数据类型&#xff08;值数据类型&#xff09;和引用数据类型。 console.log()函数 浏览器中按下F12或者右击检查&#xff0c;可以打开控制台。 在JavaScript中&#xff0…

微服务通过X-Forwarded-For获取客户端最原始的IP地址

文章目录 引言I 通过转发IP列表获取用户的IP地址II 存储真实IP字段到MDC中2.1 自己存储真实IP字段,方便获取。2.2 feign 传递MDC数据(将MDC中数据传入header)III 处理真实IP(应用)3.1 从MDC获取存储到日志系统中3.2 logback获取MDC数据(IP、追踪码)3.3 打印接口的请求IP引…

教你用python代码写一个中国象棋游戏

编写一个完整的中国象棋游戏是一个复杂的项目&#xff0c;因为它涉及到图形用户界面(GUI)的设计、游戏规则的实现、AI对手的开发等多个方面。不过&#xff0c;我可以提供一个简化的框架和一些基本思路&#xff0c;帮助你开始这个项目。 由于这里不能完整地实现一个图形化的象棋…

三十六、MyBatis-Plus(2)

&#x1f33b;&#x1f33b; 目录 一、CRUD 扩展&#xff08;1)1.1 Insert1.2 主键生成策略1.2.1 源码解释1.2.2 Twitter的snowflake算法 (雪花算法)1.2.3 主键自增&#xff1a;AUTO 我们需要配置主键自增1.2.4 手动输入&#xff1a;INPUT 就需要自己写 id 1.3 Update1.4 自动填…