详解RabbitMQ高级特性之事务

详解RabbitMQ高级特性之事务

目录

事务

添加配置

常量类

声明队列

设置RabbitTemplate

编写生产消息代码1

观察效果

编写生产消息代码2

观察效果​编辑

配置事务管理器

观察效果


事务

RabbitMQ是基于AMQP协议实现的, 该协议实现了事务机制, 因此RabbitMQ也⽀持事务机制. Spring AMQP也提供了对事务相关的操作. RabbitMQ事务允许开发者确保消息的发送和接收是原⼦性的, 要么全部成功, 要么全部失败.
添加配置
spring: application: name: rabbit-extensions-demo rabbitmq: addresses: amqp://study:[email protected]:5672/extension
常量类
public class Constants { //事务 public static final String TRANS_QUEUE = "trans.queue"; }
声明队列
import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import rabbitextensionsdemo.constant.Constants; @Configuration public class RabbitMQConfig { @Bean("transQueue") public Queue transQueue(){ return QueueBuilder.durable(Constants.TRANS_QUEUE).build(); } }

设置RabbitTemplate
import org.springframework.amqp.core.ReturnedMessage; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitTemplateConfig { @Bean("transRabbitTemplate") public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory){ RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setChannelTransacted(true); //开启事务 return rabbitTemplate; } }
编写生产消息代码1
 @Transactional @RequestMapping("/trans") public String trans(){ transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE, "trans test 1..."); transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE, "trans test 2..."); return "消息发送成功"; }
观察效果

此时我们可以看到,两条消息都进入了队列。

编写生产消息代码2
 @Transactional @RequestMapping("/trans") public String trans(){ transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE, "trans test 1..."); int num = 5/0; transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE, "trans test 2..."); return "消息发送成功"; }
观察效果

此时我们发现,抛异常了,但是队列中居然有1条消息,怎么回事?我们不是开启事务了吗?

原因是因为我们没有配置事务管理器

配置事务管理器
import org.springframework.amqp.core.ReturnedMessage; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.transaction.RabbitTransactionManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitTemplateConfig { @Bean("transRabbitTemplate") public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory){ RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setChannelTransacted(true); //开启事务 return rabbitTemplate; } @Bean public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory){ return new RabbitTransactionManager(connectionFactory); } }
观察效果

此时我们可以看到,生产消息时抛异常了,因为开启了事务,所以生产的消息没有入队列,且结果符合预期。

Read more

介绍终身机器人学习的数据集LIBERO

介绍终身机器人学习的数据集LIBERO

1 LIBERO的作用 LIBERO是一个用于研究多任务和终身机器人学习中知识迁移的综合基准测试平台,LIBERO是基于robosuite框架构建的。它专注于机器人操作任务,这些任务需要两类知识: 1. 陈述性知识:关于物体和空间关系的知识 2. 程序性知识:关于运动和行为的知识 2 核心原理 任务生成与基准设计 LIBERO提供了一个程序化生成管道,原则上可以生成无限数量的操作任务。系统包含130个任务,分为四个任务套件,每个套件都有受控的分布偏移: * LIBERO-Spatial/Object/Goal:专注于特定类型知识的迁移 * LIBERO-100:包含需要迁移纠缠知识的100个操作任务 学习框架 系统采用模仿学习作为主要学习方法,因为任务使用稀疏奖励函数(任务完成时获得+1奖励)。LIBERO提供高质量的人类遥操作演示数据集用于训练。 算法与策略架构 LIBERO实现了三种视觉运动策略网络: * bc_rnn_policy:基于RNN的行为克隆策略 * bc_transformer_policy:基于Transformer的行为克隆策略

By Ne0inhk

【架构】-- HTTP 响应状态码详解

HTTP 响应状态码详解 目录 HTTP 响应状态码详解 概述 状态码分类总览 信息响应 (100-199) 成功响应 (200-299) 重定向消息 (300-399) 重定向状态码对比 客户端错误响应 (400-499) 常见客户端错误对比 服务端错误响应 (500-599) 常见服务端错误对比 状态码快速参考表 最常用的状态码 按 HTTP 方法推荐的状态码 最佳实践 1. 状态码选择指南 2. 错误响应格式建议 3. 缓存策略 4. 安全最佳实践 5. RESTful API 设计规范 6. 常见错误处理模式 参考资料 概述 HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。状态码是 HTTP 协议的重要组成部分,帮助客户端理解服务器对请求的处理结果。

By Ne0inhk
【Rust模块管理】Rust包、crate与模块管理

【Rust模块管理】Rust包、crate与模块管理

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,ZEEKLOG全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。 所属的专栏:Rust语言通关之路 景天的主页:景天科技苑 文章目录 * 1、名词定义 * 2、包和crate * 3、Rust模块 * 3.1 模块的定义与作用 * 3.2 基本语法 * 3.

By Ne0inhk
理解 Stage 模型 —— HarmonyOS 应用架构新标准

理解 Stage 模型 —— HarmonyOS 应用架构新标准

个人主页:ujainu 文章目录 * 引言:为什么必须掌握 Stage 模型? * 一、Stage 模型 vs FA 模型:架构演进之路 * 1. FA 模型(已废弃) * 2. Stage 模型(现代标准) * 二、Stage 模型三大核心概念 * 1. UIAbility:应用的能力入口 * 2. WindowStage:窗口管理中枢 * 3. Context:上下文获取桥梁 * 三、项目结构文件详解(Stage 模型专属) * 1. `main_pages.json`:页面路由清单 * 2. `module.json5`:模块级配置(核心!) * 3. `build-profile.

By Ne0inhk