//存储未确认的消息标识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 异步模式的更多相关文章

  1. 消息确认机制---confirm异步

    一:介绍 1.异步模式介绍 Channel对象提供ConfirmListener()回调方法只包含deliverTag(当前Channel发出的序列号),我们需要自己为每一个Channel维护一个un ...

  2. RabbitMQ的六种工作模式总结

    最近学习RabbitMQ的使用方式,记录下来,方便以后使用,也方便和大家共享,相互交流. RabbitMQ的六种工作模式: 1.Work queues2.Publish/subscribe3.Rout ...

  3. RabbitMQ中Confirm确认与Return返回消息详解(八)

    理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果Broker收到消息,则会给我们生产这一个应答. 生产者进行接收应答,用来确定这条消息是否正常的发送到Broker,这种方式也是 ...

  4. 手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端)

    原文地址:手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端) 为什么使用 MQ? 在这里我就不多说了,无非就是削峰.解耦和异步.这里没有很多关于 MQ 的理论和概念,只想手把手带你一 ...

  5. 高性能的关键:Spring MVC的异步模式

    我承认有些标题党了,不过话说这样其实也没错,关于“异步”处理的文章已经不少,代码例子也能找到很多,但我还是打算发表这篇我写了好长一段时间,却一直没发表的文章,以一个更简单的视角,把异步模式讲清楚. 什 ...

  6. 异步编程系列06章 以Task为基础的异步模式(TAP)

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  7. 基于事件的异步模式(EAP)

    什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...

  8. 与其他.Net异步模式和类型进行互操作

    返回该系列目录<基于Task的异步模式--全面介绍> Tasks和异步编程模型APM(Tasks and the Asynchronous Programming Model) 从APM到 ...

  9. 实践基于Task的异步模式

    Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...

随机推荐

  1. wire [7:0] regAddr; 理解

    首先要指出的是wire[7,0]a和wire[8,1]a这样的表达在verilog中是错误的,应该写成wire[7:0]a和wire[8:1]a wire[7:0]a表示定义了一个wire型数据,该数 ...

  2. 高级数据类型-- 字符串(str),切片

    一.字符串 字符串 就是 一串字符,是编程语言中表示文本的数据类型 在 Python 中可以使用 一对双引号" 或者 一对单引号' 定义一个字符串 虽然可以使用 \" 或者 \' ...

  3. cut语法2

    linux每日一命令--cut--按文件大小排序 显示前100行 显示后五列 ll -Sh|head -n 100|cut -d ' ' -f 5- 一.基本语法cut是一个选取命令,以行为单位,用指 ...

  4. gpu/mxGPUArray.h” Not Found

    https://cn.mathworks.com/matlabcentral/answers/294938-cannot-find-lmwgpu More specifically change th ...

  5. alignedReID: surpassing human-level performance in person re-identification (paper reading)

    关键点: 1)对齐 (8%) 2)mutual learning (3%) 3)classification loss, hard triplet同时 4)re-ranking (5~6%) 关于对齐 ...

  6. C++常见的概念

    1)多态:允许将子类类型的指针赋值给父类类型的指针.赋值以后,父类对象可以根据当前赋值给它的子类对象的特性以不同的方式运作. 2)深拷贝:重新分配内存:浅拷贝:共用同一内存. 3)友元:非成员函数不能 ...

  7. zookeeper集群和安装dubbo的管控台

    准备三台服务器CentOs6: 192.168.37.132 192.168.37.128 192.168.37.131 1 将zookeeper的安装包分别解压到/usr/local/目录下 进入c ...

  8. 《Linux内核原理与分析》第三周作业

    实验:基于kernel的简单的时间片轮转多道程序内核 1.实验要求 完成一个简单的时间片轮转多道程序内核代码 2.实验过程 进入实验楼的linux环境,打开shell,输入以下代码: cd Linux ...

  9. [Java] 資料輸入的差異性(System.in、BufferedReader、Scanner)

    一.System.in System.in提供的read方法每次只能讀取一個字節的數據,不實用 二.BufferedReader BufferedReader類位於java.io包中,使用要加上 im ...

  10. 使用fpm 软件包打包

    安装 sudo gem install --no-ri --no-rdoc fpm 简单使用 一个 redis的简单demo % ls src/redis-server redis.conf src/ ...