RabbitMQ学习笔记:mandatory、publisher-confirms、publisher-return属性区别
rabbitmq客户端发送消息首先发送的交换器exchange,然后通过路由键routingKey和bindingKey比较判定需要将消息发送到那个队列queue上;在这个过程有两个地方消息可能丢失,第一消息发送到交换器exchange的过程,第二消息从交换器exchange发送到队列queue的过程;
1.publiser-confirm模式可以确保生产者到交换器exchange消息有没有发送成功
#设置此属性配置可以确保消息成功发送到交换器
spring.rabbitmq.publisher-confirms=true
2.publisher-return模式可以在消息没有被路由到指定的queue时将消息返回,而不是丢弃
#可以确保消息在未被队列接收时返回
spring.rabbitmq.publisher-returns=true
在使用上面的属性配置时通常会和mandatory属性配合一起使用:
#指定消息在没有被队列接收时是否强行退回还是直接丢弃
spring.rabbitmq.template.mandatory=true
到这里你可能会有一个疑问,这两个配置都是指定未找到合适队列时将消息退回,究竟是如何分别起作用呢?接下来我们看下RabbitAutoConfiguration自动化配置类就清楚了:
@Bean@ConditionalOnSingleCandidate(ConnectionFactory.class)@ConditionalOnMissingBeanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {PropertyMapper map = PropertyMapper.get();RabbitTemplate template = new RabbitTemplate(connectionFactory);MessageConverter messageConverter = (MessageConverter)this.messageConverter.getIfUnique();if (messageConverter != null) {template.setMessageConverter(messageConverter);}//设置rabbitmq处理未被queue接收消息的模式template.setMandatory(this.determineMandatoryFlag());Template properties = this.properties.getTemplate();if (properties.getRetry().isEnabled()) {template.setRetryTemplate((new RetryTemplateFactory((List)this.retryTemplateCustomizers.orderedStream().collect(Collectors.toList()))).createRetryTemplate(properties.getRetry(), Target.SENDER));}properties.getClass();map.from(properties::getReceiveTimeout).whenNonNull().as(Duration::toMillis).to(template::setReceiveTimeout);properties.getClass();map.from(properties::getReplyTimeout).whenNonNull().as(Duration::toMillis).to(template::setReplyTimeout);properties.getClass();map.from(properties::getExchange).to(template::setExchange);properties.getClass();map.from(properties::getRoutingKey).to(template::setRoutingKey);properties.getClass();map.from(properties::getDefaultReceiveQueue).whenNonNull().to(template::setDefaultReceiveQueue);return template;}//判定是否将未找到合适queue的消息退回private boolean determineMandatoryFlag() {/*** 获取spring.rabbitmq.template.mandatory属性配置;* 这里面会有三种可能,为null、false、true* 而只有在mandatory为null时才会读取publisher-return属性值**/Boolean mandatory = this.properties.getTemplate().getMandatory();return mandatory != null ? mandatory : this.properties.isPublisherReturns();}
阅读上面的源码可以获取如下信息:
- spring.rabbitmq.template.mandatory属性的优先级高于spring.rabbitmq.publisher-returns的优先级
- spring.rabbitmq.template.mandatory属性可能会返回三种值null、false、true,
- spring.rabbitmq.template.mandatory结果为true、false时会忽略掉spring.rabbitmq.publisher-returns属性的值
- spring.rabbitmq.template.mandatory结果为null(即不配置)时结果由spring.rabbitmq.publisher-returns确定
GitHub地址:https://github.com/mingyang66/spring-parent
RabbitMQ学习笔记:mandatory、publisher-confirms、publisher-return属性区别相关推荐
- RabbitMQ学习笔记 - mandatory参数
参考:<<RabbitMQ实战指南>> mandatory和immediate是channel.basicPublish方法中的两个参数,它们都有当消息传递过程中不可达目的地时 ...
- RabbitMQ 学习笔记
RabbitMQ 学习笔记 RabbitMQ 学习笔记 1. 中间件 1.1 什么是中间件 1.2 为什么要使用消息中间件 1.3 中间件特点 1.4 在项目中什么时候使用中间件技术 2. 中间件技术 ...
- Rabbitmq学习笔记(尚硅谷2021)
Rabbitmq学习笔记 (尚硅谷) 1.MQ 的概念 1.1 什么是 MQ? 1.2 为什么要用 MQ? 削峰 解耦 异步 1.3 MQ 的分类 ActiveMQ Kafka RocketMQ Ra ...
- Rabbitmq学习笔记教程-尚硅谷
Rabbitmq学习笔记 (尚硅谷) 尚硅谷 rabbitmq 教程 1.MQ 的概念 1.1 什么是 MQ? 存放消息的队列,互联网架构中常见的一种服务与服务之间通信的方式. 1.2 为什么要用 M ...
- RabbitMQ学习笔记(高级篇)
RabbitMQ学习笔记(高级篇) 文章目录 RabbitMQ学习笔记(高级篇) RabbitMQ的高级特性 消息的可靠投递 生产者确认 -- confirm确认模式 生产者确认 -- return确 ...
- RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)
RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...
- RabbitMQ学习笔记(3)----RabbitMQ Worker的使用
1. Woker队列结构图 这里表示一个生产者生产了消息发送到队列中,但是确有两个消费者在消费同一个队列中的消息. 2. 创建一个生产者 Producer如下: package com.wangx.r ...
- RabbitMQ学习笔记(持续更新ing)
文章目录 快速入门(java) 快速入门(springboot) 进阶 消息确认机制 消息持久化 消息公平分发 消息安全性 Prefetch 其他消息模式 发布订阅模型 死信交换机 快速入门(java ...
- 分布式消息中间件之RabbitMQ学习笔记[一]
写在前面 嗯,陆续的整理一些中间件的笔记 今天和小伙伴们分享RabbitMQ 相关笔记 博文偏理论,内容涉及: RabbitMQ的简单介绍 AMQP协议标准介绍 RabbitMQ Demo 食用方式: ...
- 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装
一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...
最新文章
- java数组赋值语句,稳进大厂
- 掌握Python字典的12个例子
- Git使用的奇技淫巧
- two.js文档阅读笔记-two.js的基本使用
- 创建oracle数据库
- 实现一个shell程序
- 游戏开发之类实现String及其迭代器(C++基础)
- 二维小游戏,飞机大战,图片素材
- 电子工程师元器件应用必备宝典
- Markdown字体,字号,颜色和背景色设置
- 对接支付宝、微信、第三方支付,超详细讲解+demo演示
- 如何将录音m4a转换为mp3格式?
- 自制java虚拟机_《深入理解Android:Java虚拟机ART》 —1.2.3 准备模拟器和自制系统镜像...
- linux 实时监控系统IO状态和IO性能
- 使用 PaddleSpeech 训练一个自己的 TTS 模型
- 我是如何通过华为面试的?群面+技术面+综合面+英语面(Android岗)
- 【什么是服务网格?】
- BZOJ1202 狡猾的商人 (Floyd)
- 科创板市价申报订单中拟用价格保护措施,买入申报的成交价不高于保护限价... 1
- 微信小程序跳转报错errMsg: “navigateTo:fail webview count limit exceed“