RabbitMQ入门_12_发布方确认
参考资料:https://www.rabbitmq.com/confirms.html
通过 ack 机制,我们可以确保队列中的消息一定能被消费到。那我们有办法保证消息发布方一定把消息发送到队列了吗?
遵照 AMQP 协议,RabbitMQ 提供了事务机制可以确保发布方消息必达。但是吞吐量会降为越来的 1/250,这个性能损耗是无法接受的。
好在 RabbitMQ 提供了类似于消费方 ack 的机制,用于确保发布方消息必达。
gordon.study.rabbitmq.features.TestPublisherConfirm.java
public class TestPublisherConfirm {
private static final String QUEUE_NAME = "publisherConfirm";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel senderChannel = connection.createChannel();
senderChannel.queueDeclare(QUEUE_NAME, false, false, true, null);
senderChannel.confirmSelect();
senderChannel.addConfirmListener(new ConfirmListener() {
@Override
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
System.out.printf("nack: %s %s\n", deliveryTag, multiple);
}
@Override
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
System.out.printf("ack: %s %s\n", deliveryTag, multiple);
}
});
for (int i = 0; i < 10;) {
String message = "NO. " + ++i;
senderChannel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
}
boolean isConfirm = senderChannel.waitForConfirms();
System.out.println("isConfirm: " + isConfirm);
connection.close();
}
}
代码第12行 confirmSelect 方法将当前信道设置为确认模式,该信道就启动了发布者确认特性。此时,RabbitMQ 会在消息被所有目标队列接收后,向发布者发送 ack,通知发布者消息已成功送达队列。如果中间出现异常,RabbitMQ 会发送 nack 通知发布者,发布者即可选择重新发送消息。
第30行 waitForConfirms 方法会阻塞住,直到两次 waitForConfirms 方法之间发送的所有消息都由 RabbitMQ 返回 ack 或 nack 通知。
除了官方文档中提到的 waitForConfirms 方法,还可以通过 ConfirmListener 来实现更高效的确认(无阻塞)。代码第13行开始创建了一个 ConfirmListener 并注册到信道中,之后, RabbitMQ 发回的 ack / nack 消息会触发相应的 handle 回调函数。
RabbitMQ入门_12_发布方确认的更多相关文章
- RabbitMQ入门:发布/订阅(Publish/Subscribe)
在前面的两篇博客中 RabbitMQ入门:Hello RabbitMQ 代码实例 RabbitMQ入门:工作队列(Work Queue) 遇到的实例都是一个消息只发送给一个消费者(工作者),他们的消息 ...
- RabbitMQ入门(3)——发布/订阅(Publish/Subscribe)
在上一篇RabbitMQ入门(2)--工作队列中,有一个默认的前提:每个任务都只发送到一个工作人员.这一篇将介绍发送一个消息到多个消费者.这种模式称为发布/订阅(Publish/Subscribe). ...
- RabbitMQ入门教程——发布/订阅
什么是发布订阅 发布订阅是一种设计模式定义了一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有的订阅者对象,使他们能够自动更新自己的状态. 为了描述这种 ...
- RabbitMQ入门到进阶(Spring整合RabbitMQ&SpringBoot整合RabbitMQ)
1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...
- RabbitMQ入门:总结
随着上一篇博文的发布,RabbitMQ的基础内容我也学习完了,RabbitMQ入门系列的博客跟着收官了,以后有机会的话再写一些在实战中的应用分享,多谢大家一直以来的支持和认可. RabbitMQ入门系 ...
- RabbitMQ入门:主题路由器(Topic Exchange)
上一篇博文中,我们使用direct exchange 代替了fanout exchange,这次我们来看下topic exchange. 一.Topic Exchange介绍 topic exchan ...
- RabbitMQ入门:路由(Routing)
在上一篇博客<RabbitMQ入门:发布/订阅(Publish/Subscribe)>中,我们认识了fanout类型的exchange,它是一种通过广播方式发送消息的路由器,所有和exch ...
- RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- RabbitMQ入门教程(十二):消息确认Ack
原文:RabbitMQ入门教程(十二):消息确认Ack 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csd ...
随机推荐
- 7.12 Models -- Frequently Asked Questions
一.Should I use a query or a filter to seach records?我应该使用一个查询或者过滤器来搜索记录吗? 这取决于你想要搜索多少reocrds并且它们是否被加 ...
- js自执行函数的常见写法
js自执行函数的常见写法 2016-12-20 20:02:26 1.关于自执行函数 1.1 写自执行函数的好处:独立的作用域,不会污染全局环境 (function() { })(); 1.2 理解重 ...
- liunx anacoda 安装pyltp
anacoda 默认的gcc是4.7需要更新 https://anaconda.org/nlesc/gcc 更新之后再安装即可. 报错: /usr/lib64/libstdc++.so.6: vers ...
- MFC工具栏的创建、设计与使用实例
本文通过实例说明MFC工具栏的创建.设计和使用方法,包括三个demo. demo1:创建一个工具栏 C++代码 //摘抄自MSDN demo1 (创建一个工具栏) 1.Create a t ...
- jquery ajax基本用法
<script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script> <s ...
- python openpyxl 2.5.4 版本 excel常用操作封装
最近搭框架用的openpyxl 2.5.4版本,之前封装的函数有些提示不推荐使用了,我做了一些更新: 代码: # encoding=utf-8 from openpyxl import load_wo ...
- 用crontab执行shell把top命令按日期追加到文件
用crontab执行shell把top命令按日期追加到文件 详细图文解说请到本人原创百度经验http://jingyan.baidu.com/article/3052f5a1daf11197f21f8 ...
- 解析分布式锁之Zookeeper实现(一)
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,本文主要阐述基于Zookeeper的分布式锁,其他两种会在后文中一起探讨.现在我们来看下使用Zookeeper如 ...
- Python Web学习笔记之CPU时间片
时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的.如果在时 间片结束时进程还在运行,则CPU将被剥夺并分配给另一个 ...
- ThinkPHP5跨控制器调用
1.在application\index\controller\文件夹里新建User.php <?php namespace app\index\controller; class User{ ...