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
- 由于事务对整个 RabbitTemplate 都会有影响,因此这里重新定义一个
Template bean
. - 还需要配置一个
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)效果演示
相关文章:
![](https://i-blog.csdnimg.cn/direct/d9f4300e75e741d4bd366256fd68fc87.gif#pic_center)
RabbitMQ高级特性 - 事务消息
文章目录 RabbitMQ 事务消息概述实现原理代码实现不采用事务采用事务 RabbitMQ 事务消息 概述 RabbitMQ 的 AMQP 协议实现了事务机制,允许开发者保证消息的发送和接收时原子性的,也就是说,要么消息全都发送成功,要么全都发送失败…...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode:心算挑战
题目: 心算项目的挑战比赛中,要求选手从N张卡牌中选出cnt张卡牌,若这cnt张卡牌数字总和为偶数,则选手成绩「有效」且得分为cnt张卡牌数字总和。给定数组cards和cnt,其中cards[i]表示第i张卡牌上的数字。 请帮参赛选手计…...
![](https://i-blog.csdnimg.cn/direct/1ce18bafa8e74d609fb2692bdf56aa52.png)
docker部署java项目(war包方式)
场景描述:java项目war包,在开发开电脑上使用dockerfile构建镜像,上传镜像到客户服务器中使用docker加载docker镜像,然后部署。 目录 一、本地环境安装 docker git 二、服务器环境安装 docker 三、构建docker镜像(win系统) 四、注意事项 (1)系统架构 (2)使…...
![](https://i-blog.csdnimg.cn/direct/d3e3bdbc01864574813fbea0398cf03b.png)
jsp 自定义taglib
一、简介 我们在javaWeb开发中,经常会用到jsp的taglib标签,有时候并不能满足我们的实际需要,这就需要我们自定义taglib标签, 二、开发步骤 1、编写control方法,继承BodyTagSupport 2、定义zdytaglib.tld标签文件 3、…...
![](https://i-blog.csdnimg.cn/direct/b08a72107a2642fab932d27b15042eed.png)
从一到无穷大 #32 TimeCloth,云上的快速 Point-in-Time Recovery
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言解决方案FAST FINE-GRAINED PITRLog FilterInter-Record Dependency ResolutionL…...
![](https://www.ngui.cc/images/no-images.jpg)
时间序列论文1——Forecasting at Scale
目录 0. AI总结0.1 文章概述0.2 研究背景0.3 研究思路0.4 研究结论与讨论1. Introduction2 Features of Business Time Series3 The Prophet Forecasting Model3.1 The Trend Model3.2 Seasonality3.3 Holidays and Events3.4 Model Fitting3.5 Analyst-in-the-Loop Modeling4 …...
![](https://i-blog.csdnimg.cn/direct/0245e9a33a1c471e8f6d0d5790f1f6f1.png)
HDFS常用命令
HDFS常用命令 1.HDFS命令介绍1.1基本语法格式1.2常用命令 1.HDFS命令介绍 HDFS 提供了一组命令行工具,用于管理和操作 HDFS 文件系统。 1.1基本语法格式 hdfs dfs -<命令> [选项] <参数>1.2常用命令 1.显示<path>指定的文件的详细信息。 had…...
![](https://i-blog.csdnimg.cn/direct/d4630e9ad2c9438d9ab9409e2999530b.png)
请问如何做好软件测试工作呢?
一、明确测试目标和范围 理解测试目的:在开始测试之前,首先要明确测试的目标和范围,确保测试计划 与需求相匹配。这有助于测试人员聚焦在关键功能上,避免浪费时间和资源。制定详细的测试计划:根据项目需求࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
单片机开发与Linux开发的区别
引言 单片机(MCU)和Linux开发是嵌入式系统领域的两大主要方向。它们在硬件平台、开发环境、应用场景和开发难度上存在显著区别。本文将系统性地比较单片机开发和Linux开发,探讨它们的主要区别及各自的应用场景和难度体系。 一、基本概念 1…...
![](https://i-blog.csdnimg.cn/direct/48d85b3409064ba581fb99737ad0ad1a.png)
【机器学习】回归类算法-相关性分析
一、前言 前面的几篇博客我们学习了分类算法,今天我们来了解一下回归类的算法吧。首先我们来谈谈两者有什么区别,首先是我们在之前的分类算法,这类算法可以将让我们学会如何将不同的数据划分到不同的类里面,输出的是一些离散的值。…...
![](https://i-blog.csdnimg.cn/direct/c33bcd3d9870415a93e5a61be77c55f0.png)
java基础 之 集合与栈的使用(三)
文章目录 Map接口(一)实现类:HashMap特点HashMap集合的一些方法 (二)实现类: TreeMap特点【自然排序】代码【定制排序】代码TreeMap集合的一些方法 HashMap 和 TreeMap的区别 前文回顾: 戳这里 …...
![](https://i-blog.csdnimg.cn/direct/453377bee2cb4383af7f9c707c7f3f1d.png)
JDK-java.nio包详解
JDK-java.nio包详解 概述 一直以来Java三件套(集合、io、多线程)都是最热门的Java基础技术点,我们要深入掌握好这三件套才能在日常开发中得心应手,之前有编写集合相关的文章,这里出一篇文章来梳理一下io相关的知识点。…...
![](https://www.ngui.cc/images/no-images.jpg)
虚拟机与服务器的区别是什么?虚拟机与服务器的区别和联系
服务器和虚拟机是两个不同的概念,它们在计算机领域有着不同的含义和作用。今天飞飞就和你分享虚拟机和服务器的区别和联系,希望可以帮助到你~ 1、物理形态 a)服务器是实实在在的物理设备,拥有独立的硬件架构。如CPU、硬盘、内存等 b)虚拟机…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux CentOS stream9 命令
初学linux,对字符界面的命令并不陌生。问到什么是linux命令直接答cd、pwd、ls是linux命令。对于命令的定义并熟悉,也不太关心命令的底层执行逻辑,更关心录入命令,马上获取需要的结果。 本文就命令的定义、分类或执行优先级作一简单介绍。 一、定义 搜索网上对linux命令的…...
![](https://i-blog.csdnimg.cn/direct/b3f05c42210d49b39f5558143d5531c3.png)
JavaScript基础——JavaScript变量声明
变量是存储数据的容器,可以变的量,值可以改变,在JavaScript中,变量声明的关键字有var、let,其中,var是ES5的语法,let是ES6的语法,变量需要先声明,在使用。 声明一个age变…...
![](https://i-blog.csdnimg.cn/direct/c0ea57f80e0d411b87dfd40e14c88b46.jpeg)
ModuleNotFoundError: No Module Named openai
题意:Python 无法在环境中找到名为 openai 的模块 问题背景: import requests from bs4 import BeautifulSoup import openai #write each line of nuclear.txt to a list with open(nuclear.txt, r) as f:lines f.readlines()#remove the newline cha…...
![](https://img-blog.csdnimg.cn/img_convert/7f7e69a05d41a9499aa4a6fdf51a39ef.png)
基于SpringBoot+Vue的校园便利平台(带1w+文档)
基于SpringBootVue的校园便利平台(带1w文档) 基于SpringBootVue的校园便利平台(带1w文档) 本平台采用B/S架构、采用的数据库是MySQL,使用JAVA技术开发。该平台的开发方式无论在国内还是国外都比较常见,而且开发完成后使用普遍,可以给平台用户…...
![](https://i-blog.csdnimg.cn/direct/966ab94ff3af4a5fbe47cffb70053eab.png#pic_center)
串口应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
串口应用编程 串口应用编程介绍 介绍 串口定义:串行接口,数据按顺序传输 串口特点:通信线路简单,距离远,速度较低 应用领域:常用工业接口 Linux系统中的作用 作为标准输入输出设备 系统打印信息输出 用户与系统交互 串口与终端:在Linux系统中,串口被视为一种终端&#…...
![](https://i-blog.csdnimg.cn/direct/eac92f75963647a8ad25c81347fec5da.png)
Canvas实现截图
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>canvas实现截图功能</title><style>.ca…...
![](https://i-blog.csdnimg.cn/direct/46d5d1cce5864b43a9ad85b63eb84ad6.png)
Python高性能计算:进程、线程、协程、并发、并行、同步、异步
这里写目录标题 进程、线程、协程并发、并行同步、异步I/O密集型任务、CPU密集型任务 进程、线程、协程 进程、线程和协程是计算机程序执行的三种不同方式,它们在资源管理、执行模型和调度机制上有显著的区别。以下是对它们的详细解释和比较: 进程&…...
![](https://www.ngui.cc/images/no-images.jpg)
kafka基本操作
Kafka详解 一、Kafka概述 Kafka是一个开源的分布式事件流平台,它主要用于高性能数据管道、流分析、数据集成和关键任务应用。Kafka最初被设计为一个分布式的基于发布/订阅模式的消息队列,但随着时间的推移,它已发展成为一个功能强大的流处理…...
![](https://i-blog.csdnimg.cn/direct/f7e8f2a8ab934d71877340b63279d064.png)
JavaFX布局-Accordion
JavaFX布局-Accordion 一个可扩展的面板,包括标题、内容与TitledPane配合一起使用 public static Accordion demo1() {// 创建AccordionAccordion accordion new Accordion();// 内边距accordion.setPadding(new Insets(10, 10, 10, 10));for (int i 1; i < 1…...
![](https://img-blog.csdnimg.cn/img_convert/0220d7f8f1e3ecc35bdb7f6e532a8b31.webp?x-oss-process=image/format,png)
【轨物方案】评估光伏组件发电性能一致性方案
光伏电站建设后运行周期长达二十多年,对于电站运营者来说,基础设施的稳定、安全、高效的运行是至关重要的。然而从近些年光伏的发展过程中看到,在电站规划到后期运维整个过程中可能存在着诸多问题,如设备选型不当、施工建设质量差…...
![](https://i-blog.csdnimg.cn/direct/76d3759080c6401a9f99be0d27368fec.png)
安全基础学习-keil调试汇编代码
初始目的是为了通过汇编编写CRC功能。 但是基础为0,所以目前从搭建工程开始记录。 大佬绕路。 (一)创建项目 1. 新建项目 打开 Keil uVision。选择 Project -> New uVision Project 创建一个新项目。选择你的目标设备(如 ARM Cortex-M 系列处理器),我这里一开始选择…...
![](https://www.ngui.cc/images/no-images.jpg)
Unity复制对象时让私有变量也被复制的简单方法
Unity复制对象时,如果一个变量为公共变量(public),那么这个变量的值会被复制到新的对象中去,但是如果一个变量是私有变量(private),默认是不会被复制的,如果希望被复制&a…...
![](https://i-blog.csdnimg.cn/direct/dc6e2ceecdf54074a85bcf6b4216bd4f.png)
Flink 实时数仓(二)【DIM 层搭建】
1、DIM 层搭建 1.1、设计要点 DIM层设计要点: DIM层存的是维度表(环境信息,比如人、场、货等)DIM层的数据存储在 HBase 表中DIM层表名的命名规范为dim_表名 DIM 层表是用于维度关联的,要通过主键(维度外…...
![](https://img-blog.csdnimg.cn/img_convert/a47c1c01b77dd749d000fa7505fb4f6a.png)
知识图谱开启了一个可以理解的人工智能未来
概述 本文是对利用知识图谱(KG)的综合人工智能(CAI)的全面调查研究,其中 CAI 被定义为可解释人工智能(XAI)和可解释机器学习(IML)的超集。 首先,本文澄清了…...
![](https://img-blog.csdnimg.cn/img_convert/993a0d10975d380760e169884c2717b4.png)
借助Aspose.html控件, 将SVG 转PNG 的 C# 图像处理库
Aspose.HTML for .NET 不仅提供超文本标记语言 ( HTML ) 文件处理,还提供流行图像文件格式之间的转换。您可以利用丰富的渲染和转换功能将SVG文件渲染为PNG、JPG或其他广泛使用的文件格式。但是,我们将使用此C# 图像处理库以编程方式在 C# 中将 SVG 转换…...
![](https://i-blog.csdnimg.cn/direct/ead74fac1fa448b3af5930a0e488ed22.png)
vs-2015安装教程
双击安装包 2-如图先选自定义,然后选安装路径(英文路径) 3-安装选项一个就够了,如图 4-点击下一步,之后如下图 5-点击安装 启动,如图则恭喜你成功安装...
![](https://img-blog.csdnimg.cn/img_convert/90c1a9496d4b85dcaabbfacc8dfa10ee.png)
Stable Diffusion绘画 | 文生图设置详解—随机种子数(Seed)
随机种子数(Seed) Midjourney 也有同样的概念,通过 --seed 种子数值 来使用。 每次操作「生成」所得到的图片,都会随机分配一个 seed值,数值不同,生成的画面就会不同。 默认值为 -1:每次随机分…...
![](/images/no-images.jpg)
网站建设怎么做?/拉新平台哪个好佣金高
复杂的世界 一个就够了 One is All 来自次元空间转置 【复杂世界里,一个就够了】一条漂亮的小鱼游进池塘,她的到来,立刻引起老居民的兴趣:小虾吩咐螃蟹选一处水草茂密的地方给她安家,还叫螃蟹帮她留心不怀好意的鲢鱼和…...
![](https://img-blog.csdnimg.cn/img_convert/2e3039c0464c7d37f2346eebaea35174.png)
知名建站公司/上海网络推广联盟
这是一个基于springboot实现分布式开源bbs论坛系统,maven多模块搭建项目,是一个分布式的bbs论坛,其主要功能是前端有发帖功能、聊天功能、回复功能后台对用户、帖子、回复管理。源码获取方式:关注头条转发文章之后私信回复【源码】即可免费获…...
![](/images/no-images.jpg)
二手房网站平台怎么做/品牌关键词优化哪家便宜
本文参考自《剑指offer》一书,代码采用Java语言。题目输入两个链表,找出它们的第一个公共结点。思路蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等。时间复杂度为O…...
![](/images/no-images.jpg)
discuz做网站赚钱经历/网络推广和网站推广平台
首先搞明白mvvm是啥意思。vm是view mode的意思。所以mvvm框架是要有一个vm对象,来映射view。也就是vm对象的属性发生改变的时候,对应的视图部分会相对应更新。比较经典的有knockoutjs,里面比较关键的概念就是view model,compute&a…...
![](/images/no-images.jpg)
张楚岚/seo算法优化
源码地址:springboot-integration 如果你觉得解决了你使用的需求,欢迎fork|star。转载于:https://www.cnblogs.com/geekdc/p/9253197.html...
![](/images/no-images.jpg)
小说类网站功能建设/关键词排名代做
背景:我想知道如何实现高级排序函数,我可以将它作为元组元素传递给python‘sorted’函数的key参数.这是一个描述我想做的事情的例子:class Book:def __init__(self, name, author, language, cost):self.name nameself.author authorself.languagelang…...