rabbitmq 不发送ack消息如何处理: RabbitMQ 消息确认以及消息消费方处理消息时候抛出了异常以
本篇的代码使用的前面两篇文章《RabbitMQ与Spring整合之消息生产方》和《RabbitMQ与Spring整合之消息消费方》的代码,这两篇文件里配置文件的名称不正确,不可直接运行。
一 自动确认机制
在服务消费者rabbitmq.xml 做修改:
- <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
 - <rabbit:listener-container acknowledge="auto"
 - connection-factory="connectionFactory">
 - <rabbit:listener queues="spring_queue_test_01" ref="consumerService" />
 - </rabbit:listener-container>
 
添加了配置 acknowledge="auto",这里来配置mq的确认机制,auto 自动确认,这也是默认缺省的配置。
特点:消费者挂掉,待ack的消息回归到队列中。消费者抛出异常,消息会不断的被重发,直到处理成功。不会丢失消息,即便服务挂掉,没有处理完成的消息会重回队列,但是异常会让消息不断重试。
ConsumerService.java
- package cn.mn.app;
 - import org.springframework.amqp.core.Message;
 - import org.springframework.amqp.core.MessageListener;
 - public class ConsumerService implements MessageListener{
 - public void onMessage(Message msg) {
 - Object obj=null;
 - System.out.println("msg-------->:"+new String(msg.getBody()));
 - try {
 - Thread.sleep(10000);
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - System.out.println("休眠结束,5秒后异常-----------------");
 - try {
 - Thread.sleep(5000);
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - System.out.println(obj.toString());
 - }
 - }
 
可以看到同一条消息不断在控制台打印出来,不断的抛出空指针。在MQ管理界面上看到消息始终存在。
二 手动确认
- <?xml version="1.0" encoding="UTF-8"?>
 - <beans xmlns="http://www.springframework.org/schema/beans"
 - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
 - xsi:schemaLocation="http://www.springframework.org/schema/beans
 - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 - http://www.springframework.org/schema/beans
 - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 - http://www.springframework.org/schema/rabbit
 - http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd">
 - <!--配置connection-factory,指定连接rabbit server参数 -->
 - <rabbit:connection-factory id="connectionFactory"
 - host="127.0.0.1" />
 - <!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
 - <rabbit:admin connection-factory="connectionFactory" />
 - <!--定义queue,如果mq服务器中没,服务器会自动创建 -->
 - <rabbit:queue name="spring_queue_test_01" durable="true"
 - auto-delete="false" exclusive="false" />
 - <!-- 定义direct exchange,绑定,如果服务器中没有会自动创建 -->
 - <rabbit:direct-exchange name="spring_exchange_test_01"
 - durable="true" auto-delete="false">
 - <rabbit:bindings>
 - <rabbit:binding queue="spring_queue_test_01" key="spring_queue_test_01_key"></rabbit:binding>
 - </rabbit:bindings>
 - </rabbit:direct-exchange>
 - <!-- 消息接收者 -->
 - <bean id="consumerService" class="cn.mn.app.ConsumerService"></bean>
 - <bean id="cnsumerServiceManu" class="cn.mn.app.ConsumerServiceManu"></bean>
 - <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
 - <rabbit:listener-container acknowledge="manual"
 - connection-factory="connectionFactory">
 - <rabbit:listener queues="spring_queue_test_01" ref="cnsumerServiceManu" />
 - </rabbit:listener-container>
 - </beans>
 
acknowledge="manual" 监听类有所变化,从MessageListener换成ChannelAwareMessageListener,因为这个接口可以提供channel,使用channel来发送确认信号。
- package cn.mn.app;
 - import java.io.IOException;
 - import org.springframework.amqp.core.Message;
 - import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
 - import com.rabbitmq.client.Channel;
 - public class ConsumerServiceManu implements ChannelAwareMessageListener {
 - public void onMessage(Message message, Channel channel) throws IOException {
 - System.out.println("consumer--:" + message.getMessageProperties()
 - + ":" + new String(message.getBody()));
 - //确认
 - channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
 - }
 - }
 
特点:只有服务端收到确认信号,即channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);确认成功,消息才会移除,确认成功后不管后面是异常还是断开服务消息已经被移除了。如果在确认之前抛出异常,消息不会移除,也不会重试,监听程序会因为异常停止不再处理消息 ,如果此时断开服务,消息重新回到队列。
三 不适用确认
- <rabbit:listener-container acknowledge="none"
 - connection-factory="connectionFactory">
 - <rabbit:listener queues="spring_queue_test_01" ref="consumerService" />
 - </rabbit:listener-container>
 
特点:acknowledge="none" 不使用确认机制,只要消息发送完成会立即在队列移除,无论客户端异常还是断开,只要发送完就移除,不会重发。
https://blog.csdn.net/liangwenmail/article/details/80542619
rabbitmq 不发送ack消息如何处理: RabbitMQ 消息确认以及消息消费方处理消息时候抛出了异常以的更多相关文章
- rabbitmq 不发送ack消息如何处理:rabbitmq可靠发送的自动重试机制
		
转载地址:http://www.jianshu.com/p/6579e48d18ae http://www.jianshu.com/p/4112d78a8753 接这篇 在上文中,主要实现了可靠模式的 ...
 - C# 消息队列 RabbitMQ
		
1.引言 RabbitMQ——Rabbit Message Queue的简写,但不能仅仅理解其为消息队列,消息代理更合适. RabbitMQ 是一个由 Erlang 语言开发的AMQP(高级消息队列协 ...
 - RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙
		
消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...
 - SpringBoot使用消息队列RabbitMQ
		
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲.消息分发的作用.RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,AMQP,即Advan ...
 - 消息队列——RabbitMQ的基本使用及高级特性
		
文章目录 一.引言 二.基本使用 1. 简单示例 2. work queue和公平消费消息 3. 交换机 三.高级特性 1. 消息过期 2. 死信队列 3. 延迟队列 4. 优先级队列 5. 流量控制 ...
 - 基于springboot工程浅谈整合rabbitmq怎么样防止消息发送mq不丢失和消费mq的消息防止丢失
		
本文只针对springboot整合rabbitmq的消息防丢失,话不多说,上干货.... 设置发送mq消息不丢失实现思路 执行的方案: 第一步,要对队列,消息以及交换机进行持久化操作(保存到物理磁盘中 ...
 - 如何处理RabbitMQ 消息堆积和消息丢失问题
		
消息堆积 解决方案: 增加消费者或后台相关组件的吞吐能力 增加消费的多线程处理 根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务 默认情况下,RabbitMQ消费者为单线程串行消费,设置并行消 ...
 - Spring AMQP 发送消息到 RabbitMQ 收到 x-queue-type 错误
		
在使用 Spring AMQP 发送消息到 RabbitMQ 的时候收到错误信息: inequivalent arg 'x-queue-type' for queue 'com.ossez.real. ...
 - rabbitmq template发送的消息中,Date类型字段比当前时间晚了8小时
		
前言 前一阵开发过程遇到的问题,用的rabbitmq template发送消息,消息body里的时间是比当前时间少了8小时的,这种一看就是时区问题了. 就说说为什么出现吧. 之前的配置是这样的: @B ...
 
随机推荐
- RTSP协议
			
1.RTSP与几个相关协议 RTSP(Real Time Streaming Protocol)实时流协议,是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通 ...
 - Win 10 无法打开内核设备“\\.\Global\vmx86”
			
Win 10操作系统, VMWareWorkstation10 无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件.你想要在安装 VMware Workstation 前重启 ...
 - scala & spark实战
			
java.lang.Long is not a valid external type for schema of string java.lang.RuntimeException: Error ...
 - HDFS数据迁移目录到正确姿势
			
添加了一块硬盘,原来的DataNode已经把原有的硬盘占满:怎么办,想要把旧有的数据迁移到新的硬盘上面: 1. 在CDH中修改目录(在HDFS组件中搜索.dir),本例中,新加的硬盘挂载在/data上 ...
 - Jasper:目录/资源
			
ylbtech-Jasper:目录/资源 1. 官网返回顶部 1. https://www.jasper.com/ 2. 2.返回顶部 1. http://api.jasperwireless.com ...
 - java  基础知识学习   JVM虚拟机参数配置
			
1) 设置-Xms.-Xmx相等: 2) 设置NewSize.MaxNewSize相等: 3) 设置Heap size, PermGen space: Tomcat 的配置示例:修改%TOMCAT_H ...
 - GBK点阵显示字库的制作和使用
			
转自:http://blog.csdn.net/exbob/article/details/6539643 GBK编码共收录汉字21003个.符号883个,并提供1894个造字码位,简.繁体字融于一库 ...
 - Arduino 视频教程
			
http://v.youku.com/v_show/id_XNDU1MjI4MzA4.html?from=y1.2-1-176.3.12-2.1-1-1-11
 - YOLO3训练widerface数据集
			
因为YOLO3速度精度都很棒,所以想训练一下人脸模型,废话不多,进入正题 1写所有的配置文件 1.1 YOLO3-face.cfg 个人感觉YOLO的配置文件骑士和caffe差不多 在cfg/YOLO ...
 - day4 函数重载
			
函数的重载 1.函数重载的定义:在同一个类中,有一个以上的同名函数,只要函数的参数列表或参数类型不一样即可,与返回值无关, 这些统称为方法的重载. 2.函数的重载存在的原因:为了增强方法的阅读性,优化 ...