您的位置:首页 > 汽车 > 时评 > 广州专业展台制作_模板网站没有源代码_优书网_手机百度app

广州专业展台制作_模板网站没有源代码_优书网_手机百度app

2025/2/12 13:57:19 来源:https://blog.csdn.net/weixin_42430947/article/details/145515756  浏览:    关键词:广州专业展台制作_模板网站没有源代码_优书网_手机百度app
广州专业展台制作_模板网站没有源代码_优书网_手机百度app

在Spring Boot项目中,RabbitMQ的retry重试配置不生效可能由以下原因导致:

核心问题定位

retry:enabled: true  # ✅ 配置已开启max-attempts: 3 # ✅ 参数有效

但实际未触发重试,可能原因如下:


1. 容器类型不匹配

症状表现

配置参数虽然正确,但应用在SimpleMessageListenerContainer(对应配置路径spring.rabbitmq.listener.simple)时,若实际使用的是DirectMessageListenerContainer(对应路径spring.rabbitmq.listener.direct),配置将不生效

验证方式

检查应用日志启动时的容器初始化信息:

2023-07-20 14:30:01 [main] INFO  o.s.a.r.l.SimpleMessageListenerContainer - Container initialized for queues: [jpaas.itinerary.audit.queue]

2. 手动ACK模式下异常未被传播

关键代码逻辑

当使用手动确认模式时,必须确保异常能传递到容器层面:

public void itineraryAudit(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {try {// 业务处理processMessage(message);channel.basicAck(tag, false); // ✅ 正常确认} catch (Exception e) {// ❌ 错误示例:捕获异常但未抛出log.error("处理失败", e);// 必须抛出异常才能触发重试throw new AmqpRejectAndDontRequeueException(e); }
}
错误模式示例
try {// ...
} catch (Exception e) {channel.basicReject(tag, false); // ❌ 直接拒绝消息,绕过重试机制
}

3. 自定义RetryTemplate覆盖配置

配置冲突场景

若代码中通过@Bean自定义了RetryTemplate:

@Bean
public RetryTemplate myRetryTemplate() {return new RetryTemplate(); // ❌ 覆盖了yaml中的配置参数
}

将导致application.yml中的配置失效


4. 异常类型不可重试

重试策略规则

Spring Retry默认仅对以下异常进行重试:

retryPolicy.setRetryableThrowableTypes(Collections.singletonMap(RuntimeException.class, true));

若业务代码抛出IOException等checked异常,默认不会被重试

解决方案

在配置中显式指定可重试异常:

retry:retryable-exceptions: java.io.IOException: true

5. 死信队列配置干扰

特殊场景

当同时配置了死信队列(DLX)时,若出现以下配置:

@Queue(value = "audit.queue", arguments = {@Argument(name = "x-dead-letter-exchange", value = "dlx.exchange"),@Argument(name = "x-dead-letter-routing-key", value = "dlx.key")
})

当消息被拒绝时可能直接进入死信队列,而不会触发重试


排查工具包

步骤1:启用DEBUG日志
logging:level:org.springframework.retry: DEBUGorg.springframework.amqp.rabbit.retry: TRACE
步骤2:观察重试日志
2023-07-20 15:00:00 DEBUG o.s.retry.support.RetryTemplate - Retry: count=0
2023-07-20 15:00:02 DEBUG o.s.retry.support.RetryTemplate - Checking for rethrow: count=1
步骤3:验证容器配置
@Autowired
private RabbitListenerEndpointRegistry registry;public void checkContainerType() {registry.getListenerContainers().forEach(container -> {System.out.println("Container class: " + container.getClass().getName());});
}

最佳实践示例

spring:rabbitmq:listener:type: simple # 强制使用simple容器simple:retry:enabled: truemax-attempts: 3max-interval: 10000initial-interval: 2000multiplier: 2retryable-exceptions: java.lang.Exception: true # 允许所有异常重试

通过上述排查和调整,可确保RabbitMQ消息消费的重试机制按预期工作。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com