【RabbitMQ】6、rabbitmq生产者的消息确认

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

通过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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泛型方法

java泛型方法简单介绍

修改jquery文件上传插件uploadify的英文为中文

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 效果&#xff1a; 对于这种样式的问题&#xff0c;我都是简单粗爆的解决&#xff1a; 找到uploadify的js文件&#xff0c;通常不是js&…

24--反转字符串中的单词 III

文章目录1.问题描述2. 代码详情1.问题描述 给定一个字符串&#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1: 输入: “Let’s take LeetCode contest” 输出: “s’teL ekat edoCteeL tsetnoc” 注意&#xff1a;在字…

poj2976 Dropping tests

01分数规划裸题 为毛二分一定要打成rmid这么恶心啊 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL;int n,k; double a[1100…

Apache Cassandra 1.1.0 稳定版发布

Apache Cassandra团队今天正式推出了1.1分支的首个稳定版1.1.0版本。Apache Cassandra是一套开源的分布式 NoSQL 数据库系统&#xff0c;遵循 Apache Lience 2 协议。它最初由 Facebook 开发&#xff0c;用于储存收件箱等简单格式数据&#xff0c;集 Google BigTable 的数据模型…

如何仅花25美元并在3小时内完成ImageNet训练?

译者 | 核子可乐编辑 | Debra、VincentAI 前线导读&#xff1a;在斯坦福大学建立的项目 DAWNBench 竞赛中&#xff0c;CIFAR10 与 ImageNet 的表现引起了人们的关注&#xff0c;在目标基本一致的前提下&#xff0c;两者的准确度分别达 94% 和 93%&#xff0c;在成本和速度上均有…

java中什么是上下文

所谓上下文&#xff0c;它是用来存储系统的一些初始化信息&#xff0c;例如在jboss中通过配置文件指定了数据源&#xff0c;那么在jboss启动的时候就把这个文件的相关信息加载到上下文中&#xff0c;于是在我们使用这个数据源的时候&#xff0c;就需要先获得系统的上下文&#…

jquery文件上传插件uploadify 讲解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.名词解释&#xff1a; tracker服务器&#xff1a;中文叫做跟踪器&#xff0c;主要做调度工作&#xff0c;在访问上起负载均衡的作用。&…

POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)

传送门&#xff1a;http://poj.org/problem?id1651 Multiplication PuzzleTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 13109 Accepted: 8034Description The multiplication puzzle is played with a row of cards, each containing a single positive integ…

25--最后一个单词的长度

文章目录1.问题描述2.代码详情1.问题描述 给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s&#xff0c;返回其最后一个单词的长度。如果字符串从左向右滚动显示&#xff0c;那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词&#xff0c;请返回 0 。 说明&…

MySQL 企业监控器 2.3.10 正式版发布

Oracle于近日发布了 MySQL 企业监控器 2.3.10 正式版。 MySQL企业监控器主要用于实施对数据库进行监控和管理。通过它&#xff0c;数据库管理员不但可以获得高级的数据复制和数据库监控功能&#xff0c;同时还可以简化安装流程。而且&#xff0c;无论是对于MySQL企业版&#xf…

Docker 跨主机网络方案分析

PS&#xff1a;文章首发公众号&#xff0c;欢迎大家关注我的公众号&#xff1a;aCloudDeveloper&#xff0c;专注技术分享&#xff0c;努力打造干货分享平台&#xff0c;二维码在文末可以扫&#xff0c;谢谢大家。 上篇文章介绍了容器网络的单主机网络&#xff0c;本文将进一步…

java中为什么使用上转型和下转型

为什么使用上转型&#xff1f;因为当一个父类有很多子类&#xff0c;子类都重写了父类的方法并加以使用。这时候&#xff0c;如果要在之前代码让你用其他子类来实现&#xff0c;就变得很简单&#xff0c;只需要把A a new B();换成A a new C();&#xff08;假设B和C都继承了A&…

session和cache的区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 以前实现数据的缓存有很多种方法&#xff0c;有客户端的Cookie&#xff0c;有服务器端的Session和Application。 其中Cookie是保存在客…

第四个

。 转载于:https://www.cnblogs.com/wxy2000/p/9657823.html

26-- 转换成小写字母

文章目录1.问题描述2.代码详情1.问题描述 实现函数 ToLowerCase()&#xff0c;该函数接收一个字符串参数 str&#xff0c;并将该字符串中的大写字母转换成小写字母&#xff0c;之后返回新的字符串。 示例 1&#xff1a; 输入: “Hello” 输出: “hello” 示例 2&#xff1a;…

java守护线程和用户线程的区别

Java中的线程可以分为两类&#xff0c;即用户线程和守护线程。用户线程是为了完成任务&#xff0c;而守护线程主要是为其他线程服务。 守护线程的唯一用途是为其他线程提供服务。守护线程会随时中断&#xff0c;因此不要在守护线程上使用需要释放资源的资源&#xff0c;如输入输…

初学duboo+zookeeper

看了很多相关资料&#xff0c;其实都没有自己动手试一次印象更深刻一些。找了很多教程&#xff0c;下工具&#xff0c;花了几个小时终于让程序跑起来了&#xff0c;下面说下步骤&#xff1a;1.java环境也就安装jdk&#xff0c;我使用的是1.7版本&#xff0c;jdk安装就不在这复述…

Fedora 17 Beta 版发布

Fedora团队今天发布了Fedora 17 Beta版本&#xff0c;这是正式版本发布前的最后一个重要的里程碑版本。据该团队介绍&#xff0c;正式版将在今年5月发布&#xff0c;将主要修复Beta版中发现的关键性bug。针对普通用户的桌面改进&#xff1a; 采用GNOME 3.4&#xff0c;提升了用…

27--字符串相加

文章目录1.问题描述2.代码详情1.问题描述 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和。 注意&#xff1a; num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包含任何前导零。 你不能使用任何內建 BigInteger 库&…