1. //存储未确认的消息标识tag
    final SortedSet<Long> confirmSet = Collections.synchronizedNavigableSet(new TreeSet<Long>());
  1. 增加监听器
    channel.addConfirmListener(new ConfirmListener() {
  2.  
  3. /*
    * 消息确认返回成功
    * 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);
    }
    }
  4.  
  5. /*消息确认返回失败*/
    @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);
    }
    }
    });
  1. 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);
    }
  1. 发送者
  1. package com.aynu.bootamqp.service;
  2.  
  3. import com.aynu.bootamqp.commons.utils.Amqp;
  4. import com.rabbitmq.client.Channel;
  5. import com.rabbitmq.client.ConfirmListener;
  6. import com.rabbitmq.client.Connection;
  7.  
  8. import java.io.IOException;
  9. import java.util.Collections;
  10. import java.util.SortedSet;
  11. import java.util.TreeSet;
  12. import java.util.concurrent.TimeoutException;
  13.  
  14. public class Send {
  15.  
  16. private final static String Exchange_NAME ="hello";
  17. public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
  18. Connection connection = Amqp.getConnection();
  19. Channel channel = connection.createChannel();
  20. //声明交换机
  21. channel.exchangeDeclare(Exchange_NAME,"topic");
  22. //在手动确认机制之前
  23. //一次只发送一条消息,给不同的消费者
  24. channel.basicQos(1);
  25. //将通道设置为comfirm模式
  26. channel.confirmSelect();
  27.  
  28. //存储未确认的消息标识tag
  29. final SortedSet<Long> confirmSet = Collections.synchronizedNavigableSet(new TreeSet<Long>());
  30. channel.addConfirmListener(new ConfirmListener() {
  31. /*
  32. * 消息确认返回成功
  33. * l:如果是多条,这个就是最后一条消息的tag
  34. * b:是否多条
  35. * */
  36. @Override
  37. public void handleAck(long l, boolean b) throws IOException {
  38. System.out.println("消息发送成功"+l+"是否多条"+b);
  39. if(b){
  40. confirmSet.headSet(l+1).clear();
  41. }else{
  42. confirmSet.remove(l);
  43. }
  44. }
  45. /*消息确认返回失败*/
  46. @Override
  47. public void handleNack(long l, boolean b) throws IOException {
  48. System.out.println("消息发送失败"+l+"是否多条"+b);
  49. if(b){
  50. confirmSet.headSet(l+1).clear();
  51. }else{
  52. confirmSet.remove(l);
  53. }
  54. }
  55. });
  56.  
  57. String routingKey ="goods.delete";
  58. for (int i = 0; i <10; i++) {
  59. String message = "hello ps"+i;
  60. long tag = channel.getNextPublishSeqNo();
  61. channel.basicPublish(Exchange_NAME,routingKey,null,message.getBytes("utf-8"));
  62. System.out.println(tag);
  63. confirmSet.add(tag);
  64. }
  65.  
  66. channel.close();
  67. connection.close();
  68. }
  69. }

接受者

  1. package com.aynu.bootamqp.service;
  2.  
  3. import com.aynu.bootamqp.commons.utils.Amqp;
  4. import com.rabbitmq.client.*;
  5.  
  6. import java.io.IOException;
  7. import java.util.concurrent.TimeoutException;
  8. @SuppressWarnings("all")
  9. public class Receive2 {
  10.  
  11. private final static String QUEUE_NAME ="hello1";
  12. private final static String Exchange_NAME ="hello";
  13. public static void main(String[] args) throws IOException, TimeoutException {
  14. Connection connection = Amqp.getConnection();
  15. Channel channel = connection.createChannel();
  16. channel.queueDeclare(QUEUE_NAME,false,false,false,null);
  17. channel.queueBind(QUEUE_NAME,Exchange_NAME,"goods.#");
  18. channel.basicQos(1);
  19. DefaultConsumer consumer = new DefaultConsumer(channel) {
  20.  
  21. @Override
  22. public void handleDelivery(String consumerTag, Envelope envelope,
  23. AMQP.BasicProperties properties, byte[] body) throws IOException {
  24. super.handleDelivery(consumerTag, envelope, properties, body);
  25. String msg = new String(body,"utf-8");
  26. System.out.println(msg);
  27. try {
  28. Thread.sleep(1000);
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }finally {
  32. // 手动发送消息确认机制
  33. channel.basicAck(envelope.getDeliveryTag(),false);
  34. }
  35. }
  36. };
  37. boolean autoAck = false;
  38. channel.basicConsume(QUEUE_NAME,autoAck,consumer);
  39. }
  40. }
  1.  

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. 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 ...

  2. 北大poj- 1006

    生理周期 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 133189   Accepted: 42577 Descripti ...

  3. Spring Boot 常见标签

    @Controller(value=“名字”,descripation="描述",tags="具体" ) @RestController控制器(path=&qu ...

  4. tp5 Excel导入

    /** * 导入Excel功能 */ public function import(){ if (!empty($_FILES)) { $file = request()->file('impo ...

  5. 二,编程语言类别,和python变量基础

    编程语言类别 机器语言:由二进制组成,直接控制操作硬件,执行效率高,开发效率低. 汇编语言:用英文代替二进制,直接操作控制硬件,执行效率高,开发效率低. 高级语言: 编译型,如C语言,类似谷歌翻译,先 ...

  6. 设计一款相册APP,代替系统自带的相册功能,列举主要功能

    分析:先分析原生相册的不足,用户需求痛点,然后描述下界面设计,并说明为什么用户要使用你的产品.       iOS系统手机,自带的相机有基础的拍照,基础的美颜效果.除了本地存储,还有icloud可以存 ...

  7. Python全栈之路----函数----匿名函数

    用lambda声明匿名函数,对lambda定义名字,才能被调用.下面的calc和func功能一致. def calc(x,y): return x*y func = lambda x,y: x*y # ...

  8. alpha冲刺(7/10)

    前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 会议照片 会议内容 陈晓彬(组长) 今日进展: 召开会议 撰写博客 项目初步整合前端代码 问题困扰: 大家可能因为某些问题会联系卡在某个点很久,需 ...

  9. python while循环案例

    1.while循环语句基本结构? while condition: loop body 2.利用while语句写出猜大小的游戏: 设定一个理想数字比如:66,让用户输入数字,如果比66大,则显示猜测的 ...

  10. kali安装Google浏览器之后的问题

    kali中,在安装完Google浏览器后会出现点击图标却打不开的问题,解决方式如下: 2019-04-10  09:46:00