本篇的代码使用的前面两篇文章《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. PS 滤镜— — sparkle 效果

    clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...

  2. python 多模块文件共享变量

    Python import 包的机制是,import进来的和默认的系统的module了,都放在sys.module这个字典里面. 多个py文件再次import的时候,会先去sys.module里面检查 ...

  3. BZOJ_1025_[SCOI2009]游戏_DP+置换+数学

    BZOJ_1025_[SCOI2009]游戏_DP+置换 Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按 顺序1 ...

  4. poj 2559 最大矩形面积(单调栈)

    题目:输入一个整数n,代表有n个  1(宽度) * h[i](高度)的矩形.接下来n个数依次给定一个矩形高度的高度h[i](i<=n). 求:在给定的依次排列的这堆矩形构成的图形里用一个矩形圈出 ...

  5. robotium 测试APK<一> 建立测试工程

    1.准备Android开发环境 2.准备签名工具http://www.troido.de/re-sign.jar 1.建立测试工程 打开Eclipse,点击File->New一个Android ...

  6. WPF TextBox PreviewTextInput handle IME (chinese)

    今天调试自己写的WPF的Behavior, 是关于TextBox只能输入数据或者小数点的. 发现有个问题, 就是英文IME下字母等等都能过滤, 但是一旦切换到中文输入法, 就会发现在OnPreview ...

  7. jquery/原生js/css3 实现瀑布流以及下拉底部加载

    思路: style: <style type="text/css"> body,html{ margin:; padding:; } #container{ posit ...

  8. 《精通Spring4.X企业应用开发实战》读后感第五章(注入参数详解)

  9. 4、map和Tuple

    一.map 1.创建map //创建一个不可变的Map scala> val ages = Map("Leo" -> 30, "Jen" -> ...

  10. NFS资料

      Linux NFS服务器的安装与配置 http://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html Linux NFS服务器的安装与配 ...