当前位置: 首页 > news >正文

加强 廉政网站建设南宁网站制作费用

加强 廉政网站建设,南宁网站制作费用,培训机构网站,网盘推广赚钱在集成RabbitMQ与Spring Boot 3.1.x时,RetryOperationsInterceptor 是实现消息重试机制的关键组件。这里将深入分析 RetryOperationsInterceptor 的工作原理,尤其是在消费者消费失败时的行为,并结合底层源码进行详解。 一、配置解析 首先&a…

在集成RabbitMQ与Spring Boot 3.1.x时,RetryOperationsInterceptor 是实现消息重试机制的关键组件。这里将深入分析 RetryOperationsInterceptor 的工作原理,尤其是在消费者消费失败时的行为,并结合底层源码进行详解。

一、配置解析

首先,需要提供 RetryOperationsInterceptor 配置如下:

// 配置重试拦截器
RetryOperationsInterceptor retryInterceptor = RetryInterceptorBuilder.stateless().maxAttempts(3) // 初次消费 + 2次重试.backOffOptions(1000, 2.0, 10000) // 初始间隔1秒,倍增因子2.0,最大间隔10秒.recoverer(new RepublishMessageRecoverer(rabbitTemplate,DEAD_LETTER_EXCHANGE,DEAD_LETTER_ROUTING_KEY)).build();

这段配置的含义如下:

  • maxAttempts(3): 设置最大尝试次数为3次,包括初次消费和2次重试。
  • backOffOptions(1000, 2.0, 10000): 设置重试的间隔策略,初始间隔为1秒,倍增因子为2.0,最大间隔为10秒。
  • recoverer: 当所有重试尝试失败后,使用 RepublishMessageRecoverer 将消息转发到指定的死信交换机和路由键。

二、RetryOperationsInterceptor 的工作原理

RetryOperationsInterceptor 是Spring Retry提供的拦截器,用于在方法执行失败时自动进行重试。结合Spring AMQP(RabbitMQ)的消息监听器容器,它能够在消息处理失败时执行重试逻辑。

1. 消息消费流程

当RabbitMQ消费者接收到消息时,以下步骤会依次执行:

  1. 消息接收: 消息被送到监听方法 onMessage
  2. 消息处理: 执行 processMessage(message) 方法进行业务处理。
  3. 成功确认: 如果处理成功,消息被确认(ACK)。
  4. 处理失败: 如果抛出异常,触发重试机制。

2. 重试拦截器的作用

processMessage 方法抛出异常时,RetryOperationsInterceptor 会拦截这个异常,并按照配置的重试策略进行重试。具体流程如下:

  1. 拦截异常: 异常被 RetryOperationsInterceptor 捕获。
  2. 执行重试: 根据 backOffOptions 设置的间隔和倍增因子,等待指定时间后重新执行 onMessage 方法。
  3. 重试次数限制: 如果重试次数未超过 maxAttempts,则继续重试;否则,执行 recoverer 逻辑。

3. 重试逻辑的底层实现

从源码角度看,RetryOperationsInterceptor 主要依赖于 RetryTemplate 来执行重试逻辑。以下是关键步骤:

  1. 构建 RetryTemplate:

    RetryTemplate retryTemplate = new RetryTemplate();
    SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
    retryPolicy.setMaxAttempts(3);
    retryTemplate.setRetryPolicy(retryPolicy);ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
    backOffPolicy.setInitialInterval(1000);
    backOffPolicy.setMultiplier(2.0);
    backOffPolicy.setMaxInterval(10000);
    retryTemplate.setBackOffPolicy(backOffPolicy);
    
  2. 执行重试:

    retryTemplate.execute(context -> {// 调用实际的消息处理方法onMessage(message);return null;
    }, context -> {// 重试失败后的回调recoverer.recover(message, context.getLastThrowable());return null;
    });
    
  3. 异常处理与恢复:

    • 每次重试失败时,RetryTemplate 会根据 BackOffPolicy 计算下次重试的等待时间。
    • 如果所有重试次数都失败,则调用 RepublishMessageRecoverer 将消息发送到死信队列。

三、与 @RabbitListener 的集成

在您的消费者代码中:

@RabbitListener(queues = RabbitConfig.MAIN_QUEUE, containerFactory = "rabbitListenerContainerFactory")
public void onMessage(String message) throws Exception {LOGGER.info("接收到消息: {}", message);// 处理消息processMessage(message);LOGGER.info("消息处理成功并确认: {}", message);
}

这里的关键在于 containerFactory 的配置,确保 RetryOperationsInterceptor 被正确应用到消息监听器容器中。

1. rabbitListenerContainerFactory 配置示例

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory,RabbitTemplate rabbitTemplate) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setAcknowledgeMode(AcknowledgeMode.AUTO);factory.setAdviceChain(retryInterceptor(rabbitTemplate));return factory;
}@Bean
public RetryOperationsInterceptor retryInterceptor(RabbitTemplate rabbitTemplate) {return RetryInterceptorBuilder.stateless().maxAttempts(3).backOffOptions(1000, 2.0, 10000).recoverer(new RepublishMessageRecoverer(rabbitTemplate,DEAD_LETTER_EXCHANGE,DEAD_LETTER_ROUTING_KEY)).build();
}

在这里,RetryOperationsInterceptor 被添加到监听器容器的 adviceChain 中,使其能够拦截 onMessage 方法的执行。

四、底层源码分析

让我们更深入地看看Spring AMQP和Spring Retry的集成是如何实现的。

1. Spring AMQP 消息监听器容器

SimpleRabbitListenerContainerFactory 创建的 SimpleMessageListenerContainer 是实际的消息监听器容器。该容器负责从RabbitMQ获取消息并调用相应的监听方法。

2. RetryOperationsInterceptor 的集成

SimpleMessageListenerContainer 中,adviceChain 被应用到消息处理逻辑中。具体来说,RabbitListenerEndpointContainer#invokeListener 方法会被 RetryOperationsInterceptor 包裹,确保在调用监听方法时执行重试逻辑。

3. RetryTemplate 的执行流程

RetryOperationsInterceptor 内部使用 RetryTemplate 来管理重试流程。其核心逻辑如下:

public Object invoke(MethodInvocation invocation) throws Throwable {return retryTemplate.execute(context -> {try {return invocation.proceed();} catch (Exception e) {throw e;}}, context -> {// 重试失败后的恢复逻辑recoverer.recover(message, context.getLastThrowable());return null;});
}

在每次重试中,RetryTemplate 会调用 invocation.proceed() 执行实际的消息处理。如果抛出异常,则根据 RetryPolicy 决定是否继续重试。

4. RepublishMessageRecoverer 的作用

当所有重试尝试失败后,RepublishMessageRecoverer 会将消息重新发布到指定的死信交换机和路由键。这是通过以下方式实现的:

public void recover(Message message, Throwable cause) {MessageProperties properties = message.getMessageProperties();properties.setHeader("x-exception-stacktrace", getStackTrace(cause));rabbitTemplate.send(deadLetterExchange, deadLetterRoutingKey, message);
}

这样,未成功处理的消息不会丢失,而是被转发到死信队列,便于后续分析和处理。

五、总结

RetryOperationsInterceptor 在Spring Boot与RabbitMQ集成中,通过拦截消息处理方法的异常,按照配置的重试策略自动执行重试逻辑,极大地提高了系统的可靠性和健壮性。其底层依赖于Spring Retry的 RetryTemplateBackOffPolicy,并通过 RepublishMessageRecoverer 实现失败后的消息转发。

通过理解上述工作原理和源码实现,可以更灵活地配置和优化消息重试机制,确保消息处理的稳定性和可控性。

http://www.yayakq.cn/news/816463/

相关文章:

  • 优客逸家网站源码贸易公司做网站怎么样
  • 技术支持 湖北网站建设网站建设电话销售技巧
  • 上海奉贤网站建设网站建设 从入门到精通pdf
  • 电子商务网站的建设论文上海专业网站制作公司
  • 红河网站建设设计做网站先做母版页
  • 建网站的免费空间做黄金比较专业的网站
  • 大学生创业做网站北京建设网办事大厅
  • 网站上的图片多大合适建网站什么网站好
  • 网站建设 教学大纲运城网站建设报价
  • 丹阳网站建设机构电商网站建设企业
  • 网站图片设置4:3典型十大优秀网络营销案例
  • 云浮网站设计如何建立公司网站南通
  • 响应式网站建设推广做h网站风险
  • 如何自己做网站发布到服务器上面网站制作费用价格表
  • 电商型网站建设wordpress打开有背景音乐
  • 原则网站设计版式网站推广广告公司
  • 企业网站建设一站式服务网站开发合同缴纳印花税吗
  • 九龙坡网站建设手机自助建站永久免费
  • 设计商城网站 优帮云wordpress 百度网盘
  • 搭建织梦网站视频教程快速搭建网站模板
  • 怎么做网站文章伪原创表白网站怎样做有创意
  • 那个网站可以做宣传手机如何创建公众号
  • 诸城网站建设多少钱宁夏 网站开发
  • 长春建设工程信息网站国外网站做家具哪个好
  • 网站运营发展前景如何做网站首页收录
  • 如何做资讯网站贵州新闻
  • 公司怎么样做网站培训班线上优化
  • 网站站外推广方式有哪些珠海建站论坛
  • 郑州网站建设公司哪家专业做资料网站违法
  • 网站开发中都引用什么文献软件手机站