Rabbitmq(7) confirm 异步模式
- //存储未确认的消息标识tag
final SortedSet<Long> confirmSet = Collections.synchronizedNavigableSet(new TreeSet<Long>());
- 增加监听器
channel.addConfirmListener(new ConfirmListener() {- /*
* 消息确认返回成功
* l:如果是多条,这个就是最后一条消息的tag
* b:是否多条
* */
@Override
public void handleAck(long l, boolean b) throws IOException {
System.out.println("消息发送成功"+l+"是否多条"+b);
if(b){
confirmSet.headSet(l+1).clear();
}else{
confirmSet.remove(l);
}
}- /*消息确认返回失败*/
@Override
public void handleNack(long l, boolean b) throws IOException {
System.out.println("消息发送失败"+l+"是否多条"+b);
if(b){
confirmSet.headSet(l+1).clear();
}else{
confirmSet.remove(l);
}
}
});
- String routingKey ="goods.delete";
for (int i = 0; i <10; i++) {
String message = "hello ps"+i;
long tag = channel.getNextPublishSeqNo();
channel.basicPublish(Exchange_NAME,routingKey,null,message.getBytes("utf-8"));
System.out.println(tag);
confirmSet.add(tag);
}
- 发送者
- package com.aynu.bootamqp.service;
- import com.aynu.bootamqp.commons.utils.Amqp;
- import com.rabbitmq.client.Channel;
- import com.rabbitmq.client.ConfirmListener;
- import com.rabbitmq.client.Connection;
- import java.io.IOException;
- import java.util.Collections;
- import java.util.SortedSet;
- import java.util.TreeSet;
- import java.util.concurrent.TimeoutException;
- public class Send {
- private final static String Exchange_NAME ="hello";
- public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
- Connection connection = Amqp.getConnection();
- Channel channel = connection.createChannel();
- //声明交换机
- channel.exchangeDeclare(Exchange_NAME,"topic");
- //在手动确认机制之前
- //一次只发送一条消息,给不同的消费者
- channel.basicQos(1);
- //将通道设置为comfirm模式
- channel.confirmSelect();
- //存储未确认的消息标识tag
- final SortedSet<Long> confirmSet = Collections.synchronizedNavigableSet(new TreeSet<Long>());
- channel.addConfirmListener(new ConfirmListener() {
- /*
- * 消息确认返回成功
- * l:如果是多条,这个就是最后一条消息的tag
- * b:是否多条
- * */
- @Override
- public void handleAck(long l, boolean b) throws IOException {
- System.out.println("消息发送成功"+l+"是否多条"+b);
- if(b){
- confirmSet.headSet(l+1).clear();
- }else{
- confirmSet.remove(l);
- }
- }
- /*消息确认返回失败*/
- @Override
- public void handleNack(long l, boolean b) throws IOException {
- System.out.println("消息发送失败"+l+"是否多条"+b);
- if(b){
- confirmSet.headSet(l+1).clear();
- }else{
- confirmSet.remove(l);
- }
- }
- });
- String routingKey ="goods.delete";
- for (int i = 0; i <10; i++) {
- String message = "hello ps"+i;
- long tag = channel.getNextPublishSeqNo();
- channel.basicPublish(Exchange_NAME,routingKey,null,message.getBytes("utf-8"));
- System.out.println(tag);
- confirmSet.add(tag);
- }
- channel.close();
- connection.close();
- }
- }
接受者
- package com.aynu.bootamqp.service;
- import com.aynu.bootamqp.commons.utils.Amqp;
- import com.rabbitmq.client.*;
- import java.io.IOException;
- import java.util.concurrent.TimeoutException;
- @SuppressWarnings("all")
- public class Receive2 {
- private final static String QUEUE_NAME ="hello1";
- private final static String Exchange_NAME ="hello";
- public static void main(String[] args) throws IOException, TimeoutException {
- Connection connection = Amqp.getConnection();
- Channel channel = connection.createChannel();
- channel.queueDeclare(QUEUE_NAME,false,false,false,null);
- channel.queueBind(QUEUE_NAME,Exchange_NAME,"goods.#");
- channel.basicQos(1);
- DefaultConsumer consumer = new DefaultConsumer(channel) {
- @Override
- public void handleDelivery(String consumerTag, Envelope envelope,
- AMQP.BasicProperties properties, byte[] body) throws IOException {
- super.handleDelivery(consumerTag, envelope, properties, body);
- String msg = new String(body,"utf-8");
- System.out.println(msg);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- // 手动发送消息确认机制
- channel.basicAck(envelope.getDeliveryTag(),false);
- }
- }
- };
- boolean autoAck = false;
- channel.basicConsume(QUEUE_NAME,autoAck,consumer);
- }
- }
Rabbitmq(7) confirm 异步模式的更多相关文章
- 消息确认机制---confirm异步
一:介绍 1.异步模式介绍 Channel对象提供ConfirmListener()回调方法只包含deliverTag(当前Channel发出的序列号),我们需要自己为每一个Channel维护一个un ...
- RabbitMQ的六种工作模式总结
最近学习RabbitMQ的使用方式,记录下来,方便以后使用,也方便和大家共享,相互交流. RabbitMQ的六种工作模式: 1.Work queues2.Publish/subscribe3.Rout ...
- RabbitMQ中Confirm确认与Return返回消息详解(八)
理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果Broker收到消息,则会给我们生产这一个应答. 生产者进行接收应答,用来确定这条消息是否正常的发送到Broker,这种方式也是 ...
- 手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端)
原文地址:手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端) 为什么使用 MQ? 在这里我就不多说了,无非就是削峰.解耦和异步.这里没有很多关于 MQ 的理论和概念,只想手把手带你一 ...
- 高性能的关键:Spring MVC的异步模式
我承认有些标题党了,不过话说这样其实也没错,关于“异步”处理的文章已经不少,代码例子也能找到很多,但我还是打算发表这篇我写了好长一段时间,却一直没发表的文章,以一个更简单的视角,把异步模式讲清楚. 什 ...
- 异步编程系列06章 以Task为基础的异步模式(TAP)
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- 基于事件的异步模式(EAP)
什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...
- 与其他.Net异步模式和类型进行互操作
返回该系列目录<基于Task的异步模式--全面介绍> Tasks和异步编程模型APM(Tasks and the Asynchronous Programming Model) 从APM到 ...
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
随机推荐
- binary and out mode to open a file
When I use binary and out mode to open a exist file, and to modify the 4th and 8th byte data to 0x78 ...
- 北大poj- 1006
生理周期 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 133189 Accepted: 42577 Descripti ...
- Spring Boot 常见标签
@Controller(value=“名字”,descripation="描述",tags="具体" ) @RestController控制器(path=&qu ...
- tp5 Excel导入
/** * 导入Excel功能 */ public function import(){ if (!empty($_FILES)) { $file = request()->file('impo ...
- 二,编程语言类别,和python变量基础
编程语言类别 机器语言:由二进制组成,直接控制操作硬件,执行效率高,开发效率低. 汇编语言:用英文代替二进制,直接操作控制硬件,执行效率高,开发效率低. 高级语言: 编译型,如C语言,类似谷歌翻译,先 ...
- 设计一款相册APP,代替系统自带的相册功能,列举主要功能
分析:先分析原生相册的不足,用户需求痛点,然后描述下界面设计,并说明为什么用户要使用你的产品. iOS系统手机,自带的相机有基础的拍照,基础的美颜效果.除了本地存储,还有icloud可以存 ...
- Python全栈之路----函数----匿名函数
用lambda声明匿名函数,对lambda定义名字,才能被调用.下面的calc和func功能一致. def calc(x,y): return x*y func = lambda x,y: x*y # ...
- alpha冲刺(7/10)
前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 会议照片 会议内容 陈晓彬(组长) 今日进展: 召开会议 撰写博客 项目初步整合前端代码 问题困扰: 大家可能因为某些问题会联系卡在某个点很久,需 ...
- python while循环案例
1.while循环语句基本结构? while condition: loop body 2.利用while语句写出猜大小的游戏: 设定一个理想数字比如:66,让用户输入数字,如果比66大,则显示猜测的 ...
- kali安装Google浏览器之后的问题
kali中,在安装完Google浏览器后会出现点击图标却打不开的问题,解决方式如下: 2019-04-10 09:46:00