本篇的代码使用的前面两篇文章《RabbitMQ与Spring整合之消息生产方》和《RabbitMQ与Spring整合之消息消费方》的代码,这两篇文件里配置文件的名称不正确,不可直接运行。

一 自动确认机制

在服务消费者rabbitmq.xml 做修改:

  1.  
    <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
  2.  
    <rabbit:listener-container acknowledge="auto"
  3.  
    connection-factory="connectionFactory">
  4.  
    <rabbit:listener queues="spring_queue_test_01" ref="consumerService" />
  5.  
    </rabbit:listener-container>                             

添加了配置 acknowledge="auto",这里来配置mq的确认机制,auto 自动确认,这也是默认缺省的配置。

特点:消费者挂掉,待ack的消息回归到队列中。消费者抛出异常,消息会不断的被重发,直到处理成功。不会丢失消息,即便服务挂掉,没有处理完成的消息会重回队列,但是异常会让消息不断重试。

ConsumerService.java

  1.  
    package cn.mn.app;
  2.  
    import org.springframework.amqp.core.Message;
  3.  
    import org.springframework.amqp.core.MessageListener;
  4.  
    public class ConsumerService implements MessageListener{
  5.  
     
  6.  
    public void onMessage(Message msg) {
  7.  
    Object obj=null;
  8.  
    System.out.println("msg-------->:"+new String(msg.getBody()));
  9.  
    try {
  10.  
    Thread.sleep(10000);
  11.  
    } catch (InterruptedException e) {
  12.  
    e.printStackTrace();
  13.  
    }
  14.  
    System.out.println("休眠结束,5秒后异常-----------------");
  15.  
    try {
  16.  
    Thread.sleep(5000);
  17.  
    } catch (InterruptedException e) {
  18.  
    e.printStackTrace();
  19.  
    }
  20.  
    System.out.println(obj.toString());
  21.  
    }
  22.  
     
  23.  
    }

可以看到同一条消息不断在控制台打印出来,不断的抛出空指针。在MQ管理界面上看到消息始终存在。

二 手动确认

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <beans xmlns="http://www.springframework.org/schema/beans"
  3.  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
  4.  
    xsi:schemaLocation="http://www.springframework.org/schema/beans
  5.  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  6.  
    http://www.springframework.org/schema/beans
  7.  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8.  
    http://www.springframework.org/schema/rabbit
  9.  
    http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd">
  10.  
    <!--配置connection-factory,指定连接rabbit server参数 -->
  11.  
    <rabbit:connection-factory id="connectionFactory"
  12.  
    host="127.0.0.1" />
  13.  
     
  14.  
    <!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
  15.  
    <rabbit:admin connection-factory="connectionFactory" />
  16.  
     
  17.  
    <!--定义queue,如果mq服务器中没,服务器会自动创建 -->
  18.  
    <rabbit:queue name="spring_queue_test_01" durable="true"
  19.  
    auto-delete="false" exclusive="false" />
  20.  
     
  21.  
    <!-- 定义direct exchange,绑定,如果服务器中没有会自动创建 -->
  22.  
    <rabbit:direct-exchange name="spring_exchange_test_01"
  23.  
    durable="true" auto-delete="false">
  24.  
    <rabbit:bindings>
  25.  
    <rabbit:binding queue="spring_queue_test_01" key="spring_queue_test_01_key"></rabbit:binding>
  26.  
    </rabbit:bindings>
  27.  
    </rabbit:direct-exchange>
  28.  
     
  29.  
    <!-- 消息接收者 -->
  30.  
    <bean id="consumerService" class="cn.mn.app.ConsumerService"></bean>
  31.  
    <bean id="cnsumerServiceManu" class="cn.mn.app.ConsumerServiceManu"></bean>
  32.  
     
  33.  
     
  34.  
    <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
  35.  
    <rabbit:listener-container acknowledge="manual"
  36.  
    connection-factory="connectionFactory">
  37.  
    <rabbit:listener queues="spring_queue_test_01" ref="cnsumerServiceManu" />
  38.  
    </rabbit:listener-container>
  39.  
     
  40.  
    </beans>

acknowledge="manual" 监听类有所变化,从MessageListener换成ChannelAwareMessageListener,因为这个接口可以提供channel,使用channel来发送确认信号。

 
ConsumerServiceManu.java
  1.  
    package cn.mn.app;
  2.  
     
  3.  
    import java.io.IOException;
  4.  
     
  5.  
    import org.springframework.amqp.core.Message;
  6.  
    import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
  7.  
     
  8.  
    import com.rabbitmq.client.Channel;
  9.  
     
  10.  
    public class ConsumerServiceManu implements ChannelAwareMessageListener {
  11.  
     
  12.  
    public void onMessage(Message message, Channel channel) throws IOException {
  13.  
    System.out.println("consumer--:" + message.getMessageProperties()
  14.  
    + ":" + new String(message.getBody()));
  15.  
    //确认
  16.  
    channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
  17.  
    }
  18.  
    }

特点:只有服务端收到确认信号,即channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);确认成功,消息才会移除,确认成功后不管后面是异常还是断开服务消息已经被移除了。如果在确认之前抛出异常,消息不会移除,也不会重试,监听程序会因为异常停止不再处理消息    ,如果此时断开服务,消息重新回到队列。

 

三 不适用确认

  1.  
    <rabbit:listener-container acknowledge="none"
  2.  
    connection-factory="connectionFactory">
  3.  
    <rabbit:listener queues="spring_queue_test_01" ref="consumerService" />
  4.  
    </rabbit:listener-container>

特点:acknowledge="none" 不使用确认机制,只要消息发送完成会立即在队列移除,无论客户端异常还是断开,只要发送完就移除,不会重发。

https://blog.csdn.net/liangwenmail/article/details/80542619

rabbitmq 不发送ack消息如何处理: RabbitMQ 消息确认以及消息消费方处理消息时候抛出了异常以的更多相关文章

  1. rabbitmq 不发送ack消息如何处理:rabbitmq可靠发送的自动重试机制

    转载地址:http://www.jianshu.com/p/6579e48d18ae http://www.jianshu.com/p/4112d78a8753 接这篇 在上文中,主要实现了可靠模式的 ...

  2. C# 消息队列 RabbitMQ

    1.引言 RabbitMQ——Rabbit Message Queue的简写,但不能仅仅理解其为消息队列,消息代理更合适. RabbitMQ 是一个由 Erlang 语言开发的AMQP(高级消息队列协 ...

  3. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  4. SpringBoot使用消息队列RabbitMQ

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲.消息分发的作用.RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,AMQP,即Advan ...

  5. 消息队列——RabbitMQ的基本使用及高级特性

    文章目录 一.引言 二.基本使用 1. 简单示例 2. work queue和公平消费消息 3. 交换机 三.高级特性 1. 消息过期 2. 死信队列 3. 延迟队列 4. 优先级队列 5. 流量控制 ...

  6. 基于springboot工程浅谈整合rabbitmq怎么样防止消息发送mq不丢失和消费mq的消息防止丢失

    本文只针对springboot整合rabbitmq的消息防丢失,话不多说,上干货.... 设置发送mq消息不丢失实现思路 执行的方案: 第一步,要对队列,消息以及交换机进行持久化操作(保存到物理磁盘中 ...

  7. 如何处理RabbitMQ 消息堆积和消息丢失问题

    消息堆积 解决方案: 增加消费者或后台相关组件的吞吐能力 增加消费的多线程处理 根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务 默认情况下,RabbitMQ消费者为单线程串行消费,设置并行消 ...

  8. Spring AMQP 发送消息到 RabbitMQ 收到 x-queue-type 错误

    在使用 Spring AMQP 发送消息到 RabbitMQ 的时候收到错误信息: inequivalent arg 'x-queue-type' for queue 'com.ossez.real. ...

  9. rabbitmq template发送的消息中,Date类型字段比当前时间晚了8小时

    前言 前一阵开发过程遇到的问题,用的rabbitmq template发送消息,消息body里的时间是比当前时间少了8小时的,这种一看就是时区问题了. 就说说为什么出现吧. 之前的配置是这样的: @B ...

随机推荐

  1. bjwc Day2 玄学

    早晨起来很开心,因为昨天跟妹子聊天聊到很晚 然后看到了题,感觉:这tm才是冬令营呀! T1构造,并没有找到性质,暴力都懒得打 T2数位dp,状态比较麻烦,看来跟dmy想到一起了,然后搞一下搞完 T3放 ...

  2. Gym - 101341I:Matrix God(随机算法)

    题意:给出N,以及三个矩阵A,B,C,大小都为N*N.问是否满足A*B=C: N<1000: 思路:由于矩阵乘法的复杂度为O(N^3):而部分验证又不能保证结果正确.我们巧妙地利用矩阵乘法的结合 ...

  3. bzoj1177&p3625 [APIO2009]采油区域p[大力讨论]

    我好菜菜啊. 给定矩形,从中选出三个边长K的正方形互不重叠,使得覆盖到的数总和最大. 想的时候往dp上钻去了..结果一开始想了一个错的dp,像这样 /************************* ...

  4. bzoj 4310 跳蚤 —— 后缀数组+二分答案+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分 ...

  5. Ubuntu 复制文件,修改文件名

    复制 cp a b   (a为旧的,b为新的) 修改 mv a b (a为旧的,b为新的)

  6. java 基础知识学习 内存泄露(memory leak) VS 内存溢出(out of memory)以及内存管理

    内存泄露(memory leak) VS 内存溢出(out of memory) 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory ...

  7. 点阵字体显示系列之一:ASCII码字库的显示

    http://blog.csdn.net/subfate/article/details/6444578 起因: 早在阅读tslib源代码时就注意到里面有font_8x8.c和font_8x16.c两 ...

  8. 3.12-3.16 Hbase集成hive、sqoop、hue

    一.Hbase集成hive https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration 1.说明 Hive与HBase整合在一起 ...

  9. HeapCreate

    为进程创建新堆,请求分配虚拟内存分页,函数原型如下: HANDLE HeapCreate( DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximu ...

  10. CentOS6下用yum升级系统最新内核版本

    首先当你决定升级内核时,要想清楚为什么升级内核,因为升级内核会带来很多麻烦.所以这种事情能避免就避免 导入 Public Key rpm --import https://www.elrepo.org ...