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();}

阅读上面的源码可以获取如下信息:

  1. spring.rabbitmq.template.mandatory属性的优先级高于spring.rabbitmq.publisher-returns的优先级
  2. spring.rabbitmq.template.mandatory属性可能会返回三种值null、false、true,
  3. spring.rabbitmq.template.mandatory结果为true、false时会忽略掉spring.rabbitmq.publisher-returns属性的值
  4. spring.rabbitmq.template.mandatory结果为null(即不配置)时结果由spring.rabbitmq.publisher-returns确定

GitHub地址:https://github.com/mingyang66/spring-parent

RabbitMQ学习笔记:mandatory、publisher-confirms、publisher-return属性区别相关推荐

  1. RabbitMQ学习笔记 - mandatory参数

    参考:<<RabbitMQ实战指南>> mandatory和immediate是channel.basicPublish方法中的两个参数,它们都有当消息传递过程中不可达目的地时 ...

  2. RabbitMQ 学习笔记

    RabbitMQ 学习笔记 RabbitMQ 学习笔记 1. 中间件 1.1 什么是中间件 1.2 为什么要使用消息中间件 1.3 中间件特点 1.4 在项目中什么时候使用中间件技术 2. 中间件技术 ...

  3. Rabbitmq学习笔记(尚硅谷2021)

    Rabbitmq学习笔记 (尚硅谷) 1.MQ 的概念 1.1 什么是 MQ? 1.2 为什么要用 MQ? 削峰 解耦 异步 1.3 MQ 的分类 ActiveMQ Kafka RocketMQ Ra ...

  4. Rabbitmq学习笔记教程-尚硅谷

    Rabbitmq学习笔记 (尚硅谷) 尚硅谷 rabbitmq 教程 1.MQ 的概念 1.1 什么是 MQ? 存放消息的队列,互联网架构中常见的一种服务与服务之间通信的方式. 1.2 为什么要用 M ...

  5. RabbitMQ学习笔记(高级篇)

    RabbitMQ学习笔记(高级篇) 文章目录 RabbitMQ学习笔记(高级篇) RabbitMQ的高级特性 消息的可靠投递 生产者确认 -- confirm确认模式 生产者确认 -- return确 ...

  6. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

  7. RabbitMQ学习笔记(3)----RabbitMQ Worker的使用

    1. Woker队列结构图 这里表示一个生产者生产了消息发送到队列中,但是确有两个消费者在消费同一个队列中的消息. 2. 创建一个生产者 Producer如下: package com.wangx.r ...

  8. RabbitMQ学习笔记(持续更新ing)

    文章目录 快速入门(java) 快速入门(springboot) 进阶 消息确认机制 消息持久化 消息公平分发 消息安全性 Prefetch 其他消息模式 发布订阅模型 死信交换机 快速入门(java ...

  9. 分布式消息中间件之RabbitMQ学习笔记[一]

    写在前面 嗯,陆续的整理一些中间件的笔记 今天和小伙伴们分享RabbitMQ 相关笔记 博文偏理论,内容涉及: RabbitMQ的简单介绍 AMQP协议标准介绍 RabbitMQ Demo 食用方式: ...

  10. 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装

    一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...

最新文章

  1. java数组赋值语句,稳进大厂
  2. 掌握Python字典的12个例子
  3. Git使用的奇技淫巧
  4. two.js文档阅读笔记-two.js的基本使用
  5. 创建oracle数据库
  6. 实现一个shell程序
  7. 游戏开发之类实现String及其迭代器(C++基础)
  8. 二维小游戏,飞机大战,图片素材
  9. 电子工程师元器件应用必备宝典
  10. Markdown字体,字号,颜色和背景色设置
  11. 对接支付宝、微信、第三方支付,超详细讲解+demo演示
  12. 如何将录音m4a转换为mp3格式?
  13. 自制java虚拟机_《深入理解Android:Java虚拟机ART》 —1.2.3 准备模拟器和自制系统镜像...
  14. linux 实时监控系统IO状态和IO性能
  15. 使用 PaddleSpeech 训练一个自己的 TTS 模型
  16. 我是如何通过华为面试的?群面+技术面+综合面+英语面(Android岗)
  17. 【什么是服务网格?】
  18. BZOJ1202 狡猾的商人 (Floyd)
  19. 科创板市价申报订单中拟用价格保护措施,买入申报的成交价不高于保护限价... 1
  20. 微信小程序跳转报错errMsg: “navigateTo:fail webview count limit exceed“

热门文章

  1. 点云分割中Proposal-based Methods与Proposal-free Methods
  2. python 虚拟环境打包exe方法及路过的坑
  3. B150主板Win7系统出现蓝屏且提示错误代码0x000000C5的原因及解决方法
  4. RobotStudio 示教器编程:MoveL指令
  5. Marshmallow详解
  6. marshmallow文档
  7. Marshmallow 的用法
  8. np.eye()和np.identity()
  9. 0704暑假集训前的欢乐大杂烩总结
  10. 网络热帖惹争议,程序员高薪现象你怎么看?