RabbitMQ的自动应答和手动应答,解决重试死循环

RabbitMQ的自动应答和手动应答,解决重试死循环

1.应答模式

RabbitMQ 中的消息应答模式主要包括两种:自动应答(Automatic Acknowledgement)和手动应答(Manual Acknowledgement)。
1、自动应答:
不在乎消费者对消息处理是否成功,都会告诉队列删除消息。如果处理消息失败,实现自动补偿(队列投递过去 重新处理)。

2、手动应答:

1.在手动应答模式下,消费者在接收到消息后并不会立即向RabbitMQ确认消息已处理完毕。消费者需要显式调用basicAck方法来确认消息处理完成,RabbitMQ只有在接收到消费者的确认后才会将消息从队列中删除。

2.采用手动应答可以提高消息的可靠性,即使消费者在处理消息过程中出现问题,只要未发送ack确认,RabbitMQ会在重新连接后再次将消息发送给该消费者。

3.如果消费者在处理消息前断开了连接,或者在处理消息期间抛出了未捕获的异常,RabbitMQ会认为消息未被正确处理,从而重新排队消息,确保消息至少会被消费一次(at least once delivery)。
在这里插入图片描述

2.SpringBoot如何实现两种应答。

2.1自动应答

在Spring Boot的配置文件application.properties中,对于RabbitMQ监听器,设置自动应答模式:

#自动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = auto

@Component
public class AutoAcknowledgementConsumer {@RabbitListener(queues = "yourQueue")public void consumeMessage(String message, Message amqpMessage) {// 处理消息...// 框架会在方法执行完成后自动发送ack确认消息}
}

2.2 手动应答

首先,同样在配置文件中启用手动应答模式

#手动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = manual

@Component
public class ManualAcknowledgementConsumer implements ChannelAwareMessageListener {@Override@RabbitListener(queues = "yourQueue")public void onMessage(Message message, Channel channel) throws Exception {try {// 处理消息...// 如果处理成功,手动发送ack确认channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {// 处理失败,可以选择重试或拒绝消息(basicNack或basicReject)channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true); // 并重新入队}}
}

3.如何解决死循环?重试机制

在这里插入图片描述

#应答模式 手动应答需要开发者手动应答
spring.rabbitmq.listener.simple.acknowledge-mode=AUTO#批量预抓取数量,提高执行效率
spring.rabbitmq.listener.simple.prefetch = 10
#开启消费者重试机制
spring.rabbitmq.listener.simple.retry.enabled = true
#重试的最大次数
spring.rabbitmq.listener.simple.retry.max-attempts = 6
#重试间隔时间
spring.rabbitmq.listener.simple.retry.initial-interval = 3000
#重试间隔倍数,默认值是1
spring.rabbitmq.listener.simple.retry.multiplier = 2
#最大间隔时间,默认值是10s
spring.rabbitmq.listener.simple.retry.max-interval = 15000

4.SimpleMessageListenerContainer和DirectMessageListenerContainer区别(了解)

SimpleMessageListenerContainer和DirectMessageListenerContainer都是Spring AMQP提供的消息监听容器,它们之间的区别在于:

  • SimpleMessageListenerContainer是基于AMQP协议的,而DirectMessageListenerContainer是基于RabbitMQ的,因此SimpleMessageListenerContainer可以用于其他的AMQP实现,而DirectMessageListenerContainer只能用于RabbitMQ。
  • SimpleMessageListenerContainer支持订阅多个队列,可以使用通配符等方式进行配置,而DirectMessageListenerContainer只能订阅一个队列。
  • SimpleMessageListenerContainer支持自动声明队列和绑定,而DirectMessageListenerContainer需要手动声明和绑定队列。
  • SimpleMessageListenerContainer支持多线程处理消息,而DirectMessageListenerContainer只能单线程处理消息。

因此,如果需要监听多个队列或者使用其他的AMQP实现,可以选择SimpleMessageListenerContainer;如果只需要监听一个队列并且使用RabbitMQ,可以选择DirectMessageListenerContainer。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/302928.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保研线性代数复习4

一.范数(Norms) 1.什么是范数? 范数是一个向量空间V的函数,每一个属于向量空间V的向量x都匹配了一个实数(它的长度): 2.范数的性质? 齐次性: 正定性: 三…

网络安全之权限维持那点事

权限维持 一旦黑客成功地入侵了目标系统,他们通常会尝试保持对系统的持久访问权,以便继续执行恶意活动,如窃取敏感数据、植入恶意软件、破坏系统功能等。 权限维持的过程可能包括以下几个方面: 后门植入:黑客可能会在…

easyExcel - 动态复杂表头的编写

目录 前言一、情景介绍二、问题分析三、代码实现方式一:head 设置方式二:模板导出方式三:自定义工具类 前言 Java-easyExcel入门教程:https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如何使用 easyExcel&…

CSS-浮动文字环绕布局、隐藏属性display、overflow、三角形制作、鼠标样式

文字环绕布局 CSS文字环绕布局是指在网页中让文字环绕在图片或其他元素周围的布局方式。这通常通过CSS中的float属性来实现。你可以将图片设置为float: left;或float: right;,然后在文本元素中使用clear属性来清除浮动,以确保文字不会覆盖图片。另外&am…

Jmeter02-2:参数化组件其他方式

0、Jmeter组件:参数化概述 0.1 是什么? 参数化是动态的获取并设置数据 0.2 为什么? 比如执行批量操作时,批量插入或批量删除,之前数据都是手写的,每执行完都要修改一次,效率太低 而参数化就是…

基于javassmJSP的教学质量评价系统

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…

maxpool long数据类型报错

报错: RuntimeError: “max_pool2d” not implemented for ‘Long’ 源码: import torch from torch import nn from torch.nn import MaxPool2dinput torch.tensor([[1, 2, 0, 3, 1],[0, 1, 2, 3, 1],[1, 2, 1, 0, 0],[5, 2, 3, 1, 1],[2, 1, 0, 1, 1…

重温OKHTTP源码

本文基于OkHttp4.12.0源码分析 官方地址 概括 本篇主要是对okhttp开源库的一个详细解析,包含详细的请求流程分析、各大拦截器的解读等。 使用方法 同步请求:创建一个OKHttpClient对象,一个Request对象,然后利用它们创建一个Ca…

文献速递:深度学习胰腺癌诊断--基于螺旋变换的胰腺癌分割模型驱动深度学习方法

Title 题目 Model-Driven Deep Learning Method forPancreatic Cancer Segmentation Basedon Spiral-Transformation 基于螺旋变换的胰腺癌分割模型驱动深度学习方法 01 文献速递介绍 胰腺癌是最致命的恶性肿瘤之一,其特点是诊断延迟、治疗困难和高死亡率。患者…

采用Flink CDC操作SQL Server数据库获取增量变更数据

采用Flink CDC操作SQL Server数据库获取增量变更数据 Flink CDC 1.12版本引入了对SQL Server的支持,包括SqlServerCatalog和SqlServerTable。在SqlServerCatalog中,你可以根据表名获取对应的字段和字段类型。 SQL Server 2008 开始支持变更数据捕获 (C…

【C语言】简单介绍进制和操作符

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 本文简要介绍进制和操作符,愿能为您提供帮助!文章…

论文解读:吴恩达来信AI Agent技巧—利用自我反馈的迭代细化技术

《自我完善:利用自我反馈的迭代细化技术》 https://arxiv.org/pdf/2303.17651.pdf 摘要 Large language models (LLMs) 经常无法在一次尝试中生成最佳输出。受人类在修改书面文本时所表现出的迭代精炼过程的启发, 我们提出了 SELF-REFINE&#xff0c…

R语言绘图 | 散点小提琴图

原文链接:R语言绘图 | 散点小提琴图 本期教程 写在前面 本期的图形来自发表在Nature期刊中的文章,这样的基础图形在日常分析中使用频率较高。 获得本期教程数据及代码,后台回复关键词:20240405 绘图 设置路径 setwd("You…

CSDN 广告太多,停更通知,转移到博客园

文章目录 前言新博客地址 前言 CSDN的广告实在是太多了,我是真的有点忍不了。直接把广告插在我的文章中间。而且我已经懒得找工作了,我当初写CSDN的目的就是为了找工作,有个博客排名。当时经济环境实在是太差了。我也没必要纠结这个2000粉丝…

因为使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景,博主所在的业务组有一个核心系统,需要同步两个不同数据源给过来的数据到redis中,但是每次同步之前需要过滤掉一部分数据,只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

快排序解读

排序算法是计算机科学中不可或缺的一部分,它们在各种数据处理场景中发挥着关键作用。在众多排序算法中,快速排序以其高效的性能和简洁的实现成为了许多程序员的首选。今天,我们就来深入剖析快速排序算法,了解其原理、实现方式以及…

比特币革命:刚刚开始

作者:Marius Farashi Tasooji 编译:秦晋 要充分理解比特币及其含义,首先必须理解什么是价值,什么是货币。以及是什么赋予资产价值? 这个问题看似愚蠢,但实际上非常有趣。我们的生活是由我们消费或出售的物品…

【问题解决】ubuntu安装新版vscode报code-insiders相关错误

问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb ,双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错,执行其他命令也报错。 安装环境:ubuntu18.04 dpkg: 处理软件包 code-insiders (…

Taro框架中的H5 模板基本搭建

1.H5 模板框架的搭建 一个h5 的基本框架的搭建 基础template 阿乐/H5 Taro 的基础模板

在Spring中使用Redis

端口怎么设置,看我前一篇文章 前面使用jedis,通过Jedis对象中各种方法来操作redis的。 此处Spring中则是通过StringRedisTemplate来操作redis。 最原始提供的类是RedisTemplate StringRedisTemplate是RedisTemplate的子类,专门处理文本数据的…