2019独角兽企业重金招聘Python工程师标准>>>

通过Publisher Confirms and Returns机制,生产者可以判断消息是否发送到了exchange及queue,而通过消费者确认机制,Rabbitmq可以决定是否重发消息给消费者,以保证消息被处理。

1.什么是Publisher Confirms and Returns?

Delivery processing acknowledgements from consumers to RabbitMQ are known as acknowledgements in AMQP 0-9-1 parlance; broker acknowledgements to publishers are a protocol extension called publisher confirms. 
地址:http://www.rabbitmq.com/confirms.html

根据RabbitMq官网定义,rabbitmq代理(broker)对发布者(publishers)的确认被称作发布者确认(publisher confirms),这种机制是Rabbitmq对标准Amqp协议的扩展。因此通过这种机制可以确认消息是否发送给了目标。

2.如何通过Spring amqp来使用Publisher Confirms and Returns机制?

Confirmed and returned messages are supported by setting the CachingConnectionFactory’s publisherConfirms and publisherReturns properties to ‘true’ respectively.When these options are set, Channel s created by the factory are wrapped in an PublisherCallbackChannel, which is used to facilitate the callbacks. When such a channel is obtained, the client can register a PublisherCallbackChannel.Listener with the Channel. The PublisherCallbackChannel implementation contains logic to route a confirm/return to the appropriate listener. These features are explained further in the following sections. 
http://docs.spring.io/spring-amqp/docs/1.6.3.RELEASE/reference/html/_reference.html#cf-pub-conf-ret

通过Spring amqp文档可以看到,要使用这种机制需要将Template模版的设publisherConfirms 或publisherReturns 属性设置为true,此外ConnectionFactory要配置为CachingConnectionFactory。

<bean id="connectionFactory"class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"><property name="host" value="192.168.2.133" /><property name="port" value="5672" /><property name="username" value="sun" /><property name="password" value="123456" /><property name="publisherConfirms" value="true" /><property name="publisherReturns" value="true" /></bean>

2.1 ConfirmCallback的使用及触发的一种场景

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.stereotype.Service;/*** @author wangzhongqiu*         Created on 2017/10/31.* @description:继承RabbitTemplate.ConfirmCallback,消息确认监听器*/
@Service
public class ConfirmCallBackListener implements RabbitTemplate.ConfirmCallback {private Logger log = LoggerFactory.getLogger(CommonProducer.class);@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {log.info("收到回调,成功发送到broker");}
}

2.2 ReturnCallback的使用及触发的一种场景

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;/*** @author wangzhongqiu*         Created on 2017/10/31.* @description:继承RabbitTemplate.ReturnCallback,消息发送失败返回监听器*/
@Service
public class ReturnCallBackListener implements RabbitTemplate.ReturnCallback {private Logger log = LoggerFactory.getLogger(CommonProducer.class);@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {log.info("收到回调");log.info("return--message:" + new String(message.getBody()) + ",replyCode:" + replyCode + ",replyText:" + replyText + ",exchange:" + exchange + ",routingKey:" + routingKey);}
}

使用场景:

如果消息没有到exchange,则confirm回调,ack=false

如果消息到达exchange,则confirm回调,ack=true

exchange到queue成功,则不回调return

exchange到queue失败,则回调return(需设置mandatory=true,否则不回回调,消息就丢了)

转载于:https://my.oschina.net/xiaominmin/blog/1811701

【RabbitMQ】6、rabbitmq生产者的消息确认相关推荐

  1. rabbitmq怎样确认是否已经消费了消息_【朝夕专刊】RabbitMQ生产者/消费者消息确认...

    欢迎大家阅读<朝夕Net社区技术专刊> 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦! 上篇文章介绍了R ...

  2. RabbitMQ:消费者ACK机制、生产者消息确认

    文章目录 基础案例环境搭建: 环境: 1. 生产者发送消息确认 1.1 confirm 确认模式 1.2 return 退回模式 源代码 1.1.3 小结 2. 消费者签收消息(ACK) 2.1 代码 ...

  3. rabbitmq消息队列 ack机制(消息确认机制)和消息补偿机制

    参考:https://blog.csdn.net/pan_junbiao/article/details/112956537 ack 机制就是消息在 生产者在发布消息以后,消息存在内存中,如果消息被确 ...

  4. RabbitMq(十四)消息的事务支持及代码演示

    在rabbitmq中我们也有类似数据库的事务需求,及当程序运行过程中出现异常时,不能完整的执行一个流程时,为了保持功能完整性,我们需要将之前发送的消息也不让他发送出去,此时就需要使用到rabbitmq ...

  5. 【RabbitMQ】RabbitMQ架构模型

    目录 RabbitMQ架构模型 Producer:生产者 Consumer:消费方 Broker:服务节点 Queue队列: Exchange:交换器 --fanout广播 --topic主题 --d ...

  6. springboot + rabbitmq 用了消息确认机制,感觉掉坑里了

    最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI.不过,话说回来这的确是件好事,与其开那些没味的扯皮会,多做技术交流还是很有助于个人 ...

  7. RabbitMQ之消息确认机制(事务+Confirm)

    概述 在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达brok ...

  8. rabbitmq 启动异常_RabbitMQ:消息发送确认 与 消息接收确认(ACK)

    默认情况下如果一个 Message 被消费者所正确接收则会被从 Queue 中移除 如果一个 Queue 没被任何消费者订阅,那么这个 Queue 中的消息会被 Cache(缓存),当有消费者订阅时则 ...

  9. RabbitMQ的消息确认ACK机制

    1.什么是消息确认ACK. 答:如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失.为了确保数据不会丢失,RabbitMQ支持消 ...

最新文章

  1. Bootstrap系列 -- 38. 基础导航条
  2. android使用tabhost实现导航
  3. php 父子进程通信,PHP 进程及进程间通信
  4. d3 i5 神舟精盾k480n_6款神舟精盾轻薄记本发布,10nm十代酷睿,匠心打造国潮好本...
  5. 3D 真的很难吗,瞧瞧支付宝怎么做?
  6. iOS中XML解析 (二) libxml2(实例:打印xml内容及存储到数组)
  7. 万字图解Java多线程,不信你学不会!
  8. gnu grub修复_如何修复grub异常
  9. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.11. 只用索引的扫描
  10. 实例协议分析RFC1483:AAL5和几种常见ADSL接入技术
  11. 工具使用教程(二)【Github上传文件大于100M的文件】
  12. Au入门系列之九:多轨混音
  13. CS5211替代LT7211B参数特性与优势|DP转LVDS方案
  14. 用c++随机生成10小学生算术题的课设
  15. ios 根据日期知道周几_iOS 计算指定日期是周几星期几
  16. Photoshop 2023 Mac(PS 2023)v24.0.0中英文已发布,新功能详细介绍,支持M1/M2/intel
  17. 聊一聊推荐系统中ExploitExplore算法
  18. 论文翻译——中国武汉市2019年新型冠状病毒感染患者的临床特征
  19. java需要打开开机启动项吗_开机启动项
  20. oj. 1008——最长公共子序列

热门文章

  1. android 动态获取全县_省市县 ------ 三级滚动(android)
  2. 解决myeclipse报错500,MySQLyog报错误码问题
  3. leetcode181. 超过经理收入的员工(SQL)
  4. leetcode 190. 颠倒二进制位
  5. leetocde 225. 用队列实现栈
  6. 网络游戏的客户端同步问题 .
  7. NLP复习资料(3)-六~七章:马尔科夫模型与条件随机场、词法分析与词性标注
  8. 密码学专题 随机数文件
  9. Java 计算两个日期之间的相差天数
  10. IDEA 创建 SpringBoot 项目