RabbitMQ double ack 报错

谷粒商城实战笔记-260-商城业务-消息队列-可靠投递-消费端确认 消费者端的确认机制(ACK/NACK)是RabbitMQ中一种重要的特性,它允许消费者告知Broker它们是否成功处理了接收到的消息。basic.ack:当消费者成功处理了一条消息时,它可以发送一个basic.ack(肯定确认)给Broker,指示这条消息可以安全删除。// deliveryTag是消息的唯一标识符,multiple参数设为false表示仅确认这一条消息如果消费者无法处理消息,它可以发送一个basic.nack(否定确认)。这可以让Broker重新分发消息,或者直接丢弃它。 阅读详情

报错信息:

16:50:10.134 ERROR 17788 ---  o.s.a.r.c.CachingConnectionFactory       : 
Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)

使用rabbitmq的时候总是报错信道关闭。网上查了原因,大多说的是因为没有配置RabbitAdmin,无法自动创建exchange的。但是我配置了RabbitAdmin,也能够自动创建exchange,还是报这个错,而且这个错居然不影响消息队列运行。
后来看到这篇文章https://www.cnblogs.com/zhjh256/p/6434093.html,其中提到double ack问题,联想到我配置了序列化为json格式,所以重新配置了rabbitmq,

@Configuration
public class RabbitMqConfig {

    @Bean
    public RabbitAdmin rabbitTemplate(ConnectionFactory connectionFactory) {
        return new RabbitAdmin(connectionFactory);
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(messageConverter);
        return template;
    }

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(messageConverter);
        return factory;
    }

    @Bean
    public MessageConverter messageConverter() {
        return new ContentTypeDelegatingMessageConverter(new Jackson2JsonMessageConverter());
    }
}

在yml配置文件中设置了手动ack


spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: rabbit
    password: 123456
    virtual-host: /
    #生产端
    publisher-confirms: true
    publisher-returns: true
    template:
      mandatory: true
    #消费端
    listener:
      simple:
        acknowledge-mode: manual
        #初始连接数量
        concurrency: 5
        #最大连接数量
        max-concurrency: 10
        #限流
        prefetch: 1

yml中的签收模式失效,被注解注入的SimpleRabbitListenerContainerFactory覆盖,而它默认使用了自动签收。但是消费消息的时候又手动进行channel.basicAck(deliveryTag, false),于是导致了两次ack,所以报错。
解决方法是在rabbitmq的factory中指定ack模式。

 public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
      SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
      factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
      factory.setConnectionFactory(connectionFactory);
      factory.setMessageConverter(messageConverter);
      return factory;
  }
  ```
SpringBoot异步导入导出实战:从原理到生产级实现 在后台系统开发中,处理大批量数据导入导出是常见需求。同步阻塞方式会严重影响用户体验和系统稳定性,因此异步任务处理成为关键技术方案。其核心原理是将耗时操作从用户请求线程中剥离,交由后台线程池或消息队列异步执行,从而提升系统吞吐量和响应速度。从技术价值看,异步处理不仅能改善用户体验,更是保障系统高可用的重要手段,尤其适用于数据报表生成、批量数据同步等场景。本文聚焦于在SpringBoot框架下构建健壮的异步任务模块,详细解析了结合线程池、数据库状态管理以及EasyExcel流式处理的最佳实践,并深入探讨了如何通 阅读详情

相关推荐

软件熵减与匠艺实践:用可验证精度对抗系统混沌

在软件工程中,‘熵’并非玄学隐喻,而是可量化、可干预的系统退化度量——它体现为状态扩散、契约模糊与修复路径爆炸等客观现象;其底层原理源于热力学第二定律在复杂系统中的映射:无持续结构化约束,系统必然滑向不可维护的混沌。技术价值在于将抽象专业主义转化为可执行的精度锚点,如事务超时分级、OpenAPI字段精度强制校验、领域模型的熵隔离设计等。典型应用场景覆盖微服务治理、大促稳定性保障、技术债防控及新人工程能力培养。本文聚焦‘熵减’与‘匠艺’的闭环实践,提供从Git提交规范到领域建模、从契约测试到熵导向监控的七层防

世范水晶 240

channel.basicAck(deliveryTag, false);第二个参数的作用

这是一个与接收的消息相关的唯一标识符,用于标识当前处理的消息实例。这个标识符是由RabbitMQ分配给消息的,并且是在同一个通道(channel)中是唯一的。标识),而不影响任何其他的消息。这是一种精确控制消息确认的方式,有助于保证消息处理的准确性和可靠性,尤其是在处理一些关键的或有序的数据时非常有用。方法是用来确认消息已经被消费者接收并处理。时,你的意图是确认消费者已成功处理了具体的那条消息(由。在使用RabbitMQ的AMQP协议进行消息处理时,

caohuixue_2021的博客 2633

Redis十大数据类型全解析:从原理到实战应用

在分布式系统和高性能服务架构中,键值存储是核心基础组件之一,它通过内存存储和高效数据结构实现快速数据访问。其原理基于内存操作和多样化的数据结构支持,能够显著提升应用性能并降低数据库负载。这一技术价值在于为缓存、会话存储、实时统计等场景提供了高并发解决方案。在应用场景上,从基础的字符串缓存到复杂的流处理,覆盖了计数器、排行榜、消息队列、地理位置服务等多种需求。本文聚焦Redis的十大数据类型,深入探讨String、Hash、List、Set、Sorted Set、GEO、Bitmap、HyperLogLog、

weixin_33861800的博客 432

RabbitMQ消息可靠性解决方案

1. 解决方案 客户端代码中的异常捕获,包括生产者和消费者 AMQP/RabbitMQ的事务机制 发送端确认机制 消息持久化机制 Broker端的高可用集群 消费者确认机制 消费端限流 消息幂等性 2. 异常捕获机制 先执行业务操作,业务操作成功后执行消息发送,消息发送过程通过try catch 方式捕获异常, 在异常处理理的代码块中执行行回滚业务操作或者执行行重发操作等。这是一种最大努力确保的方式, 并无法保证100%绝对可靠,因为这里没有异常并不代表消息就一定投递成功。 boolean result

rzpy_qifengxiaoyue的博客 1195

OPNET卫星节点仿真避坑指南:为什么你的STK轨道文件导入后位置不对?

本文深入解析OPNET卫星节点仿真中STK轨道文件导入后位置异常的常见问题,揭示坐标系差异(ECI与ECF)、时间基准不匹配等关键因素。通过修改.SA文件头标识、统一时间基准等解决方案,帮助工程师避免仿真失真,提升卫星通信系统仿真的准确性。特别适用于STK与OPNET协同工作的卫星网络仿真场景。

weixin_30335575的博客 600

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 340

rabbitmq的消息持久化和消费者ack确认

消息持久化 队列持久化 交换机持久化 ExchangeBuilder.directExchange("normalExchange").build(); 消费者ack确认 multiple:批量 比如批量确认: 当multiple的值设置为true时,RabbitMQ将确认指定传输标签以及之前所有未被确认的消息。与单个确认相同,批量确认的作用域为每个通道。例如:通道Ch上有四个未被确认的消息,标签分别为5,6,7,8;当一个delivery_tag值为8并且multiple值为true的确认消息到达

奔跑的菜鸡 2169

Jacobi正交多项式在数值分析中的应用与实现

本文深入探讨了Jacobi正交多项式在数值分析中的核心应用与实现。作为最通用的正交多项式族,Jacobi多项式通过参数α和β的调节,可退化为切比雪夫、勒让德等经典多项式,为函数逼近、奇异积分和微分方程求解提供了统一框架。文章重点解析了其在加权高斯积分(高斯-雅可比积分)和谱方法求解微分方程中的关键作用,并提供了基于递归关系和SciPy的稳定高效实现方案,帮助读者掌握这一强大的数值计算工具。

weixin_29306011的博客 246

Day34_RabbitMQ—高级部分

文章目录一、RabbitMQ高级特性1.消息的可靠投递2.Consumer Ack3.消息可靠性总结4.消费端限流5.TTL6.死信队列概述(面试重点)7.死信队列代码实现(面试重点)8.延迟队列(面试重点)二、RabbitMQ 应用问题1.消息可靠性保障——消息补偿机制2.消息幂等性保障——乐观锁解决方案 一、RabbitMQ高级特性 1.消息的可靠投递 1.confirm确认模式 2.return模式 2.Consumer Ack Consumer Ack表示消费

weixin_45014721的博客 602

Anaconda创建python环境常见命令

Anaconda功能庞大,其可以理解为一个工具,也是一个可执行命令。Anaconda可以创建多个python环境,且python环境间相互独立。

m0_59405106的博客 1万+

VTK GPU 加速渲染技术

/ 创建颜色工具// 创建立方体数据// 创建OpenGL映射器(注意使用vtkOpenGLPolyDataMapper而不是常规的vtkPolyDataMapper)// 启用VBO(顶点缓冲对象)// 声明几何体是静态的以获得最佳性能// 创建actor// 创建渲染器、渲染窗口和交互器renderWindow->SetWindowName("VTK自定义着色器示例");// 添加actor到渲染器。

深之JohnChen的专栏 1242

记一次rabbitmq因double ack导致的报错:method channel.close (reply-code=406, reply-text=PRECONDITION_FAILED ...

场景: 搭建了一套rabbitmq的高可用服务,生产端和消费端都能正常使用,但在日志中竟然出现了一条Error信息,不能忍啊!Error信息如下: 2020-05-13 00:19:13.324 ERROR 12499 --- [68.152.119:5672] o.s.a.r.c.CachingConnectionFactory : Channel shutdown: channel error; protocol method: #method<channel.close>

DamonREN的博客 7611

专栏三:解析spatialCNV的使用

文章Spatially resolved clonal copy number alterations in benign and malignant tissue发在natur

m0_58549466的博客 1252

rabbitmq reply-text=PRECONDITION_FAILED - unknown delivery tag 1

问题现象:RabbitMQ double ack 报错 16:50:10.134 ERROR 17788 --- o.s.a.r.c.CachingConnectionFactory : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1,

江黎 7740

嵌入式工程师必学(118):MCU的硬件定时器和中断

大多数微处理器都有一个或多个可编程硬件定时器,这些定时器包括对中断的支持。可以有不同类型的计时器,用于不同的应用程序。例如,LPC1768 具有四个 32 位通用定时器、一个看门狗定时器、一个重复中断定时器、一个系统滴答定时器、一个正交编码器接口、6 个 PWM 输出和一个支持中断的实时时钟。硬件定时器用于计时和计数作,允许处理器在 timer 进程运行时继续执行其他进程。硬件定时器是一种使用 clock 信号来增加 register 的电路。

码农17年的博客 211

【AI产品与商业航图】Flux.1 完全开源 AI 绘图模型:本地部署与 ComfyUI 实战指南

Flux.1是一个开源项目,用户可以自由使用和修改,完全免除使用费用。🖥️本地部署支持:与一些依赖云端计算的工具不同,Flux.1支持本地部署,确保用户可以离线使用并自主控制数据隐私。🔄兼容ComfyUI框架:Flux.1可以无缝集成到ComfyUI中,用户可以享受更加简便和直观的操作界面。🎨卓越的图像生成能力:Flux.1能够生成高质量、细腻的图像,支持多种风格与创作主题的切换。💾低硬件要求。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1737

[rabbitmq] Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406

rabbitmq 报错日志: 2021-05-08 15:30:00,023 ---[ visitor ]--- ERROR [AMQP Connection ip:5672] Caller+0 at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$DefaultChannelCloseLogger.log(CachingConnectionFactory.java:1278) - Channel shutdo..

时光钟摆 2万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JB4-6-消息队列

消息队列,Message,MessageQueue,幂等性,可靠性,RocketMQ,NameSrv,Broker,生产消费模型,消息类型,RabbitMQ,交换机,TTL延迟等。

周航宇的博客 1670

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SpringBoot实战:高并发床位调度系统设计与防超卖策略

资源调度系统是优化资源配置、提升运营效率的核心技术方案,其核心原理在于通过统一的规则引擎与状态管理,对有限资源进行动态分配与协调。在医疗、电商、交通等行业,资源调度技术能显著解决资源错配与浪费问题,创造巨大的业务价值。本文聚焦于医疗信息化中典型的“全院一张床”应用场景,深入探讨如何利用SpringBoot框架构建高并发、高可用的床位资源调度平台。针对【床位管理】和【高并发】两大核心挑战,文章详细拆解了基于数据库悲观锁、乐观锁及状态机模型的事务一致性保障方案,并提供了从业务模型设计、技术选型到防超卖实战代码的

weixin_34218579的博客 713

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java最高频八股文速通

final 类:String 类被声明为 final,这意味着它不能被继承,从而防止了通过继承改变其行为。final 字段:String 类中的 value 字段是 final 的,这保证了 String 对象在创建后其内部字符数组不会被改变。没有提供修改方法:String 类没有提供任何可以修改其内容的方法。所有对 String 的操作(如拼接、替换等)都会生成一个新的String 对象。

qq_43751506的博客 6395

手搓AI Agent军团:DeepSeek V4 Pro + LangChain本地化实战

AI Agent 是一种能自主感知、决策与执行的智能体系统,其核心在于将大语言模型(LLM)与工具调用、状态管理、任务编排深度耦合。原理上依赖结构化工具定义(Tool Schema)、可靠的消息通信机制及可审计的执行链路。技术价值体现在摆脱‘提示词工程师’依赖,实现端到端自动化运维、CI/CD协同与日志智能分析等工程闭环。典型应用场景包括故障自愈、发布流程编排、多源日志联动分析等。本文聚焦基于 DeepSeek V4 Pro 的本地化 AI Agent 实战落地,覆盖 LangChain 集成、tool c

weixin_34184561的博客 347

JMS消息中间件:Java企业级异步解耦与可靠通信的核心技术

消息中间件作为分布式系统架构中的关键组件,其核心价值在于实现系统间的异步通信与解耦。通过定义统一的消息传递规范,它允许不同服务以松耦合方式交互,生产者将消息发送至中间件,消费者按需获取,即使目标系统暂时不可用,消息也能可靠存储而不会丢失。这种机制不仅提升了系统的可伸缩性和容错能力,还优化了资源利用率。在Java企业级开发领域,JMS(Java Message Service)作为访问各类消息中间件的统一API标准,提供了点对点队列和发布/订阅主题两种核心模型,并内置了事务、确认及持久化等可靠性保障机制。无论

weixin_30800987的博客 312

企业AI编排实战:MuleSoft与LangChain分层协同架构

AI编排是企业将大模型能力嵌入现有业务系统的关键技术路径,其本质是通过结构化调度实现数据、逻辑与权限的协同治理。核心原理在于解耦确定性任务(如鉴权、脱敏、协议转换)与不确定性任务(如语义推理、多步决策),从而兼顾合规性、响应SLA与模型灵活性。该技术显著提升AI落地稳定性与可运维性,广泛应用于智能客服、销售预测、风控中台等需跨系统整合的场景。本文聚焦MuleSoft与LangChain在真实生产环境中的职责边界、消息协同机制及四层责任矩阵设计,提供可复用的集成范式。

weixin_30776545的博客 1320

黑马点评项目 | Redis学习笔记「纯享版」10w字超详细总结(含资料)

这次笔记是本人二刷Redis实战篇黑马点评的8w字汇总笔记。如果需要资料,于本文末尾查找即可

2025优快云博客之星Top246,后端开发技术领域新星创作者。 3万+

计算机扫盲(下篇)

由于篇幅问题这篇文章被迫分成上下两篇建议反复上下对比着看,能应付生活中的使用就行。不是学操作系统的不用了解太深。实在不会就喂给ai帮你理解。逆向工程 = 通过分析程序的二进制文件,理解它的行为和逻辑。正常开发:源代码 → 编译 → 可执行文件 逆向工程:可执行文件 → 反汇编/反编译 → 理解逻辑5.2.1 指令与机器码1. 指令的组成 机器码格式(x86/x64):必会的汇编指令2. 常见寄存器3. 汇编代码中的栈重要观念:函数调用时生成的栈帧,在汇编层面根本不是一个必须存在的“结构”。, , , 等指

2504_94717629的博客 525

后端大厂面试总结大全

1、首先,通过BeanDefinitionReader 读取指定的配置文件生成bean的定义信息,然后到完整的bean定义信息(BeanDefinition对象),注意这里只是存储bean的定义信息,还没有实例化bean对象;就像工厂里面一样,原材料已经准备好了,但是还没有进行生产,原材料就是beanDefinition,生产就是实例化。2、在 BeanDefinition 和 完整BeanDefinition 中间通过一个后置增强器,可以对bean的定义信息进行统一修改,只需要实现 BeanFactory

zouyang920的博客 426
上一篇: jasypt对配置文件加密解密
下一篇: spring boot2配置redis缓存,缓存使用Jackson2序列化
more_try
博客等级 码龄11年 13粉丝 32原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值