掌控消息全链路(4)——RabbitMQ/Spring-AMQP高级特性详解之事务与消息分发

掌控消息全链路(4)——RabbitMQ/Spring-AMQP高级特性详解之事务与消息分发
在这里插入图片描述

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶》《计算机网络》《Java工程师核心能力体系构建》《RabbitMQ理论与实践》天行健,君子以自强不息。


1.事务

AMQP(高级消息队列协议)实现了事务机制,主要用于确保消息的原子性发布和确认。换言之,它允许你将多个操作(如发送消息、确认消息)绑定在一起,要么全部成功,要么全部失败

发送消息

@RestController@RequestMapping("/producer")publicclassProducerController{@Resource(name ="transRabbitTemplate")privateRabbitTemplate transRabbitTemplate;@Transactional@RequestMapping("/trans")publicStringtrans(){ transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE,"trans test ---> 1");int num =5/0; transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE,"trans test ---> 2");return"发送成功";}}
在这里插入图片描述


Spring Boot的RabbitMQ自动配置默认会确认模式,但RabbitMQ不允许同一个通道同时使用事务模式和确认模式,所以需要确保publisher confirms被禁用

spring:rabbitmq:publisher-confirm-type: none publisher-returns:false

配置RabbitTemplate和事务管理器

@ConfigurationpublicclassRabbitTemplateConfig{@Bean("transRabbitTemplate")publicRabbitTemplatetransRabbitTemplate(ConnectionFactory connectionFactory){RabbitTemplate rabbitTemplate =newRabbitTemplate(connectionFactory); rabbitTemplate.setChannelTransacted(true);return rabbitTemplate;}@BeanpublicRabbitTransactionManagerrabbitTransactionManager(ConnectionFactory connectionFactory){returnnewRabbitTransactionManager(connectionFactory);}}

配置队列

@ConfigurationpublicclassRabbitMQConfig{@Bean("transQueue")publicQueuetransQueue(){returnQueueBuilder.durable(Constants.TRANS_QUEUE).build();}}

2.消息限流

消息限流(Flow Control) 是RabbitMQ防止生产者发送消息速度超过消费者处理能力,导致消息积压和系统崩溃的保护机制

发送消息

@RestController@RequestMapping("/producer")publicclassProducerController{@Resource(name ="rabbitTemplate")privateRabbitTemplate rabbitTemplate;@RequestMapping("/qos")publicStringqos(){for(int i =0; i <20; i++){ rabbitTemplate.convertAndSend(Constants.QOS_EXCHANGE,"qos","qos test:"+ i);}return"发送成功";}}

配置消费者

@Component@Slf4jpublicclassQosListener{@RabbitListener(queues =Constants.QOS_QUEUE)publicvoidhandMessage(Message message,Channel channel)throwsIOException{long deliveryTag = message.getMessageProperties().getDeliveryTag();try{ log.info("接收到消息:{},deliveryTag:{}",newString(message.getBody(),StandardCharsets.UTF_8), deliveryTag); log.info("处理成功");// channel.basicAck(deliveryTag, true); // 消费者不确认消息}catch(Exception e){ channel.basicNack(deliveryTag,true,true);}}}

限制每个消费者未确认的最大消息数

spring:rabbitmq:listener:simple:acknowledge-mode: manual # 消费者确认机制prefetch:5

声明和配置交换器、队列和绑定关系

@ConfigurationpublicclassRabbitMQConfig{@Bean("qosQueue")publicQueueqosQueue(){returnQueueBuilder.durable(Constants.QOS_QUEUE).build();}@Bean("qosExchange")publicDirectExchangeqosExchange(){returnExchangeBuilder.directExchange(Constants.QOS_EXCHANGE).build();}@Bean("qosBinding")publicBindingqosBinding(@Qualifier("qosExchange")DirectExchange directExchange,@Qualifier("qosQueue")Queue queue){returnBindingBuilder.bind(queue).to(directExchange).with("qos");}}
在这里插入图片描述

Read more

【Python基础:语法第一课】Python 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系

【Python基础:语法第一课】Python 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 * 1 ~> 常量和表达式 * 2 ~> 变量和类型 * 2.1 变量是什么 * 2.2 变量的语法 * 2.2.1 定义变量 * 2.2.2 使用变量 * 2.3 变量的类型:对于不同种类的变量作出区分 * 2.3.1 整数 * 2.

By Ne0inhk
[特殊字符] Python在CentOS系统执行深度指南

[特殊字符] Python在CentOS系统执行深度指南

文章目录 * 1 Python环境安装与配置问题 * 1.1 系统自带Python的限制 * 1.2 安装Python 3的常见问题及解决方案 * 1.3 SSL模块问题解决方案 * 1.4 环境变量配置与管理 * 1.5 软件集合(SCL)替代方案 * 2 包管理与虚拟环境问题 * 2.1 pip包管理器问题与解决方案 * 2.2 虚拟环境的最佳实践 * 2.3 依赖兼容性问题解决 * 2.4 虚拟环境目录结构理解 * 3 模块导入与路径问题 * 3.1 Python模块搜索路径机制 * 3.2 常见模块导入错误与解决 * 3.3 路径配置最佳实践 * 3.4 特殊模块问题处理 * 3.

By Ne0inhk

ezdxf库终极指南:Python CAD自动化从入门到精通

ezdxf库终极指南:Python CAD自动化从入门到精通 【免费下载链接】ezdxfPython interface to DXF 项目地址: https://gitcode.com/gh_mirrors/ez/ezdxf 想要用Python操控CAD图纸却不知从何入手?ezdxf库为你打开了通往CAD自动化世界的大门。这个纯Python实现的DXF文件处理工具,让你无需安装任何CAD软件就能轻松读写、编辑和生成图纸文件。无论你是机械工程师、建筑设计师,还是数据可视化开发者,掌握ezdxf都将让你的工作效率倍增。 快速入门:5分钟上手ezdxf 安装与环境配置 安装ezdxf库只需一行命令,简单到让人难以置信: pip install ezdxf 验证安装是否成功: import ezdxf print(f"ezdxf版本: {ezdxf.__version__}") 你的第一个DXF文件 让我们从一个简单的例子开始,感受ezdxf的强大之处: import ezdxf # 创建新图纸 -

By Ne0inhk
在 macOS 下升级 Python 几种常见的方法

在 macOS 下升级 Python 几种常见的方法

在 macOS 下升级 Python 有几种常见的方法,具体取决于你最初是如何安装 Python 的。了解你的安装方式是关键。 首先,你需要知道你当前 Python 版本以及它的安装路径。 1. 检查 Python 版本: python --version# 可能指向 Python 2.x python3 --version# 通常指向 Python 3.x 2. 检查 Python 路径: which python which python3 根据你 which 命令的输出,我们可以推断出安装方式。常见的安装方式有: * macOS 系统自带 Python: 通常在 /usr/bin/python。不建议直接修改或升级系统自带的

By Ne0inhk