RocketMQ消息注解实战:用@RocketMQMessageListener实现订单超时取消功能

【信息科学与工程学】计算机科学与自动化——第一百三十五篇 开发框架篇 系列二 Spring框架系列 03 Spirng 01 编号机制/用法表现形式和配置编译器(底层实现·说明·缺陷·缺陷解决方案(含数学方程式描述与数学建模))引入版本国产化·信创·商用的CPU/GPU/ASIC/NP/DPU/其他硬件S1控制反转 (IoC)​ / 依赖注入 (DI)​- XML配置 () - Java注解 (, , ) - Java配置类 (, )底层实现: 反射 + 工厂模式 + 容器(Map)。 说明: 通过反射实例化Bean,解析依赖关系并注入。 缺陷: 运行时性能损耗(反射调用慢);循环依赖问题(构造器注入场景) 阅读详情

RocketMQ消息注解实战:用@RocketMQMessageListener实现订单超时取消功能

电商系统中订单超时自动取消是一个典型业务场景。当用户下单后未在规定时间内完成支付,系统需要自动释放库存并关闭订单。本文将深入探讨如何基于RocketMQ的延迟消息和@RocketMQMessageListener注解构建这一功能,并提供完整的实现方案。

1. 电商订单超时场景的技术挑战

电商平台的订单超时处理面临几个核心问题:

  • 分布式系统状态同步:订单服务与库存服务通常部署在不同节点
  • 定时任务精度问题:传统轮询方式存在时间误差和性能瓶颈
  • 消息可靠性保障:必须确保超时消息不丢失、不重复
  • 系统扩展性需求:大促期间需处理突增的订单量

RocketMQ的延迟消息特性完美匹配这些需求。其核心优势在于:

特性传统方案RocketMQ方案
精度分钟级误差秒级精确
可靠性数据库依赖持久化存储
吞吐量数千TPS十万级TPS
扩展性水平扩展困难天然分布式

2. 环境准备与基础配置

2.1 依赖引入

使用Spring Boot Starter简化集成:

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.2.3</version>
</dependency>

2.2 基础配置

application.yml关键配置:

rocketmq:
  name-server: 127.0.0.1:9876
  producer:
    group: order-service-group
    send-message-timeout: 3000
  consumer:
    pull-batch-size: 32

提示:生产环境建议配置集群模式,name-server填写多个地址用分号分隔

3. 延迟消息生产端实现

3.1 消息发送工具类

@Component
@RequiredArgsConstructor
public class OrderTimeoutSender {
    private final RocketMQTemplate rocketMQTemplate;
    
    private static final String ORDER_TIMEOUT_TOPIC = "ORDER_TIMEOUT";
    private static final int DELAY_LEVEL = 3; // 对应10秒延迟

    public void sendTimeoutMessage(String orderId) {
        rocketMQTemplate.syncSend(
            ORDER_TIMEOUT_TOPIC, 
            MessageBuilder.withPayload(orderId).build(),
            3000,  // 发送超时3秒
            DELAY_LEVEL
        );
    }
}

RocketMQ预设的延迟级别对应关系:

延迟级别延迟时间
11秒
25秒
310秒
......
182小时

3.2 订单创建时发送消息

@Service
@Transactional
public class OrderService {
    private final OrderTimeoutSender timeoutSender;
    
    public Order createOrder(CreateOrderCommand command) {
        Order order = new Order();
        // 订单持久化逻辑...
        
        // 发送30分钟超时消息(延迟级别16=30分钟)
        timeoutSender.sendTimeoutMessage(order.getId());
        
        return order;
    }
}

4. 消息消费端实现

4.1 基础消费者实现

@Component
@Slf4j
@RocketMQMessageListener(
    topic = "ORDER_TIMEOUT",
    consumerGroup = "order-timeout-consumer",
    consumeThreadMax = 16  // 提高并发处理能力
)
public class OrderTimeoutConsumer implements RocketMQListener<String> {
    
    @Override
    public void onMessage(String orderId) {
        try {
            handleTimeoutOrder(orderId);
        } catch (Exception e) {
            log.error("处理超时订单失败: {}", orderId, e);
            throw new RuntimeException(e); // 触发重试
        }
    }
    
    private void handleTimeoutOrder(String orderId) {
        // 业务逻辑实现...
    }
}

4.2 幂等性处理方案

为防止消息重复消费,需要实现幂等控制:

@Transactional
public void handleTimeoutOrder(String orderId) {
    Order order = orderRepository.findById(orderId)
        .orElseThrow(() -> new OrderNotFoundException(orderId));
    
    if (order.getStatus() != OrderStatus.PENDING_PAYMENT) {
        log.warn("订单[{}]当前状态为{},跳过处理", orderId, order.getStatus());
        return;
    }
    
    order.cancel("超时未支付");
    inventoryService.releaseStock(order.getItems());
    
    orderRepository.save(order);
}

关键幂等检查点:

  1. 订单状态校验
  2. 数据库唯一约束
  3. 分布式锁控制

5. 高级特性与异常处理

5.1 消费重试机制

RocketMQ默认重试16次,间隔逐渐增加:

@RocketMQMessageListener(
    // ...其他参数
    maxReconsumeTimes = 5  // 自定义最大重试次数
)

重试间隔策略:

重试次数间隔时间
110秒
230秒
31分钟
42分钟
53分钟

5.2 死信队列监控

当消息超过最大重试次数后,会进入死信队列。监控配置:

@Scheduled(fixedDelay = 60000)
public void monitorDeadLetter() {
    // 查询死信队列消息
    Collection<MessageExt> deadLetters = rocketMQTemplate.receive(
        "%DLQ%order-timeout-consumer",
        100,  // 每次拉取数量
        5000  // 超时时间
    );
    
    deadLetters.forEach(msg -> {
        String orderId = new String(msg.getBody());
        log.error("订单超时处理失败进入死信队列: {}", orderId);
        alertService.notifyAdmin(orderId);
    });
}

6. 性能优化实践

6.1 批量消费配置

@RocketMQMessageListener(
    // ...其他参数
    consumeMessageBatchMaxSize = 32,  // 批量消费数量
    pullBatchSize = 64                // 拉取批量大小
)

6.2 线程池调优参数

参数说明推荐值
consumeThreadMin最小线程数CPU核心数
consumeThreadMax最大线程数CPU核心数×2
pullInterval拉取间隔(ms)0(实时拉取)

7. 线上问题排查指南

常见问题及解决方案:

消息堆积排查

# 查看消费者进度
sh mqadmin consumerProgress -n name-server:9876 -g order-timeout-consumer

# 查看线程堆栈
jstack <pid> | grep -A 30 ConsumeMessageThread_

消息重复消费检查

-- 数据库检查
SELECT COUNT(DISTINCT order_id) FROM order_timeout_log 
WHERE create_time > DATE_SUB(NOW(), INTERVAL 1 HOUR);

延迟消息不生效排查

  1. 检查Broker配置:messageDelayLevel
  2. 验证发送代码的delayLevel参数
  3. 监控Broker存储情况
RocketMQ 生产端发送完消息,为什么消费端注解监听:RocketMQMessageListener 延时特别长 谁用谁知道。 阅读详情

相关推荐

从0~1带大家实现 单体或微服务下 实现订单未支付超时取消功能 方案(2)-rocketmq 延迟队列方案 完整demo设计和源码

单体或微服务下 实现订单未支付超时取消功能 方案(2)-rocketmq 延迟队列方案 我们日常接触的电商或者票类平台等都有一些共通的功能,比如下单了,超过某时间未支付,则会自动取消该订单 开发的角度来说就是订单从创建成功状态到取消状态,这个并不能靠前端去维护,一个是安全角度不够,另一个就是性能不足和维护复杂度太高 后台去处理就涉及了同步取消和异步取消两大种类方式,具体如下 说明:本文基于minicloud框架下,各位可以用各自得微服务项目即可,本文主要是提供其中一种思路

峡谷电光马仔的博客 2089

再有人问你如何实现订单到期关闭,就把这篇文章发给他!

我们介绍了11种实现订单定时关闭的方案,其中不同的方案各自都有优缺点,也各自适用于不同的场景中。

m0_46995061的博客 1028

Cadence数模混合仿真实战:从Verilog到ADE L的完整流程解析

本文详细解析了Cadence数模混合仿真的完整流程,从Verilog代码编写到ADE L仿真环境配置。通过实战案例讲解如何创建Config文件、搭建混合信号原理图,并分享提高仿真效率的技巧和常见问题排查方法,帮助工程师掌握这一关键芯片设计验证技术。

weixin_29246195的博客 988

RocketMQ延时消息实战:电商订单超时自动取消的5分钟实现方案

本文详细介绍了如何利用RocketMQ的延时消息功能,优雅实现电商场景中“订单超时自动取消”的核心需求。通过对比传统方案,阐述了RocketMQ延时消息在解耦、性能和可靠性方面的优势,并提供了从环境配置、消息发送到消费处理的完整代码级实战指南,同时分享了生产环境下的监控、幂等性处理等高级技巧与避坑经验。

gpt4scribbler的博客 635

TPS563201DDCR电路翻车实录:从原理图到PCB,我踩过的5个坑及补救方法

本文详细记录了使用TPS563201DDCR电源芯片设计电路时遇到的5个常见问题及解决方案,包括EN引脚配置、BST电容选型、反馈网络设计、PCB布局优化以及散热处理。通过实际案例和数据分析,帮助工程师避免类似错误,提升电源模块的可靠性和效率。

weixin_42532938的博客 533

2025东方财富笔试考什么?cata能力测评攻略|答题技巧真题分享

4月10日-4月20日 专业笔试(行测+金融知识混合双打) 4月25日-5月10日 面试车轮战(AI面+半结构化+压力面) 5月15日起 Offer发放(谈薪必杀技:对标同花顺/雪球)这里不仅是金融极客的乐园,更是**“年薪30万管培生计划”**的主战场——你将用代码重构K线,用算法预判市场,成为资本市场的“数字先知”。东方财富,中国金融信息服务领域的“隐形冠军”,以**“金融数据+互联网”双擎驱动**,打造了覆盖证券、基金、期货的全生态交易平台。:• “我总坚持自己的方案”(HR:团队毒药!

Dgntsj的博客 3262

SpringBoot与RocketMQ整合,实现分布式场景下的订单超时自动取消功能

前后端微服务商城项目,手把手教学!随着电子商务平台的快速发展,订单管理系统需要处理大量的订单数据。为了提高用户体验和系统效率,我们需要实现一个订单超时自动取消的功能。该功能能够在用户下单后一定时间内(例如10分钟),如果用户未完成支付或其他必要的操作,则自动取消订单。功能实现的关键点1.消息队列的选择与配置选择合适的消息队列:根据业务需求选择合适的消息队列系统(如RocketMQ、Kafka等)...

qq_18244417的博客 841

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

订单超时怎么处理?我们用这种方案

如果对于超时精度比较高,超时时间在24小时内,且不会有峰值压力的场景,推荐使用RocketMQ的定时消息解决方案。在电商业务下,许多订单超时场景都在24小时以上,对于超时精度没有那么敏感,并且有海量订单需要批处理,推荐使用基于定时任务的跑批解决方案。参考链接:[1][2][3][4]

AlbenXie的博客 1334

Windows 10下Gpg4win 4.3.1安装与配置全攻略:从下载到邮件加密实战

本文详细介绍了在Windows 10系统下安装和配置Gpg4win 4.3.1的全过程,包括下载、验证、自定义安装以及密钥管理。特别重点讲解了如何通过Kleopatra证书管理器进行密钥创建和管理,以及在Outlook中实现邮件加密的实战操作,帮助用户全面提升数据安全防护能力。

weixin_29271263的博客 302

CTS实战:如何用set_sense优化时钟树平衡(附ICC2避坑指南)

本文深入探讨了在时钟树综合(CTS)中,如何正确使用`set_sense`命令优化时钟树平衡,并对比了其与`set_disable_timing`的本质区别。通过实战案例详细解析了`-stop_propagation`和`-clock_leaf`参数的应用场景,并提供了ICC2工具中的关键避坑指南,帮助后端工程师精准控制时钟拓扑,避免时序分析漏洞。

weixin_28933797的博客 460

rocketmq实现取消超时订单?兜底方案?

在电商场景中,使用 RocketMQ 实现 “取消超时未支付订单” 是典型的异步化方案,核心依赖其特性。同时,为应对消息丢失、消费失败等异常,需设计多层兜底机制。

xintaitehao的博客 704

备战2025数学建模国赛(算法29):博弈论在数学建模竞赛中的应用

博弈论为数学建模竞赛提供了强大的分析工具,尤其适用于涉及多方互动决策的问题。本文介绍了博弈论的核心模型、算法实现及竞赛应用案例,并提供了完整的Python代码实现。扩展阅读方向不完全信息博弈与贝叶斯均衡合作博弈与联盟形成机制设计与拍卖理论随机博弈与马尔可夫决策过程博弈论与机器学习的结合。

YOLO 443

【RocketMQ】实战使用案例

通过 putUserProperty(String key, String value) 设置,内置系统属性 + 自定义属性:【一】系统内置属性(RocketMQ 识别,不能随意覆盖)(1)MSG_PROP_DELAY 延迟消息等级值:1~18,对应 1s/5s/10s…2h 预设延迟档位作用:定时 / 延迟投递,消息存入延迟队列,到期才分发(2)MSG_PROP_TIMER_TRANS_DELAY 精确定时(5.x+)毫秒时间戳,支持任意精确时间,替代固定等级延迟。

weixin_44823875的博客 121

有限元分析-静力学分析-与分析解对比-——以阶梯轴的静力分析为例——静态结构分析

150mm,a=300mm{a=300mm}a=300mm,b=200mm{b=200mm}b=200mm,L=1000mm{L=1000mm}L=1000mm,F=300kN{F=300kN}F=300kN,材料为45,弹性模量E=2.1e11Pa{E=2.1e11Pa}E=2.1e11Pa,泊松比v=0.28{v=0.28}v=0.28,屈服应力δs=355MPa{δ_s=355MPa}δ。使用line body生成的模型,可以选择自动划分网格的,WB会将以梁单元将其划分完成,例如图2所示。

qq_15963745的博客 68

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RocketMQ 学习笔记

传统项目架构下的问题:请求方向响应方发送请求,如果中间链路出现问题,那么信息无法送到,请求方也没法发送了。MQ全称 Message Queue,是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。中间放一个MQ,生产者把消息给MQ,MQ把消息往下分发给消费者。RabbitMQ 处理速度快,但是是 erlang 语言,需要配置环境RocketMQ 吞吐量高总体来说RabbitMQ用于中小型项目,RocketMQ用于大型项目,kafka 用于大数据。

weixin_57796792的博客 516

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Spring Cloud Alibaba】RocketMQ(二)

如果Broker端还没有返回SendResult,⽽⽣产者主线程已经停⽌了,那么SendCallback的执⾏线程也就会随主线程⼀起停⽌,对应的⽅法⾃然也就⽆法执⾏了。但是,这⾥还是会造成⼀种分裂,消息最终是由Consumer来处理,但是消息却是由Broker推送过来的,也就是说,Consumer⽆法确定⾃⼰将要处理的是哪些消息。这时,就可以创建另外⼀个新的消费者组,并通过ConsumerFromWhere属性指定这个消费者组的消费起点,从⽽让这个新的消费者组去消费之前发送过的历史消息。

Blue_Pepsi_Cola的博客 333

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

常用的分布式事务解决方案

事务由一组操作构成,我们希望这组操作能够全部正确执行,如果这一组操作中的任意一个步骤发生错误,那么就需要回滚之前已经完成的操作。也就是同一个事务中的所有操作,要么全都正确执行,要么全都不要执行。到此为止,所介绍的事务都是基于单数据库的本地事务,目前的数据库仅支持单库事务,并不支持跨库事务。而随着微服务架构的普及,一个大型业务系统往往由若干个子系统构成,这些子系统又拥有各自独立的数据库。往往一个业务流程需要由多个子系统共同完成,而且这些操作可能需要在一个事务中完成。在微服务系统中,这些业务场景是普遍存在的。

ywl470812087的博客 12万+

RocketMq快速入门

被调用一次。

2302_79213775的博客 227

从零构建高可用电子发票Web服务:Spring Boot微服务架构实战

RESTful API是现代企业级应用系统集成的核心技术,它通过标准化的HTTP协议实现服务间的数据交互与功能调用,其设计质量直接决定了系统的可维护性与扩展性。在微服务架构下,API服务需要应对高并发、分布式事务和数据一致性等挑战,这要求开发者深入理解异步处理、消息队列和缓存等核心原理。特别是在涉及第三方服务集成的场景中,如电子发票开具,异步解耦与可靠消息传递成为保障系统稳定性的关键技术。通过引入RocketMQ或Kafka实现请求的异步化处理,并结合Redis缓存提升查询性能,可以构建出既能应对突发流量,

weixin_34152820的博客 417

订单超时自动取消3种方案——我们用这种!

大家好,我是田哥,大家对电商购物应该都比较熟悉了,我们应该注意到,在下单之后,通常会有一个倒计时,如果超过支付时间,订单就会被自动取消。下单今天,我们来聊聊订单超时未支付自动取消的几种方案。1.定时任务这是最容易想到的办法,定时任务去轮询数据库,取消即将超时的订单。订单轮询定时任务实现方式有很多种,大概可以分为两类:本地定时任务和分布式定时任务。定时任务实现本地定时任务,适用于单机版的业务系统,实...

田维常 757

订单超时自动取消的 N 种方法

定时任务和延迟消息。1、定时任务定时任务实现策略,我们可以简单划分为单机版和集群版。笔者并不认可单机版,背八股文当然可以,订单自动取消这个业务场景,生产环境还是要慎重。每种方式各有优缺点,笔者更倾向于任务调度平台 XXL-JOB 这种方式。2、延迟消息延时消息是一种非常优雅的模式。消息队列 RocketMQ自研延迟服务Redis 延迟队列。假如技术团队基础架构能力很强,笔者推荐使用 RocketMQ 或者自研延迟服务。

竹林幽深 2182

RocketMQ 优化订单超时取消流程

基础方案中用户直接与支付宝交互,电商无法控制用户支付动作(如订单已超时,用户仍可能扫码支付),当前仅通过支付宝回调接口判断订单状态并发起回退,效率低下。(通常设定固定支付时限,如 5 分钟),核心需求为:超时未支付则取消本地订单、释放库存,并通知支付平台取消支付订单。为间隔,批量扫描超过支付时限未支付的订单,执行取消订单和释放库存操作,作为 RocketMQ 事务消息的兜底,保证。以图灵电商项目为例,将订单超时判断的频繁查询逻辑替换为 RocketMQ 事务消息的。在基础支付流程上增加。

2403_85207115的博客 795

领导:谁再用定时任务实现关闭订单,立马滚蛋!

在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;那他们是怎么实现的呢? 一般的做法有如下几种 定时任务关闭订单 rocketmq延迟队列 rabbitmq死信队列 时间轮算法 redis过期监听 一、定时任务关闭订单(最low) 一般情况下,最不推荐的方式就是关单方式就是定时任务方式,原因我们可以看下面的图来说明 ..

m0_58554082的博客 1671

RocketMQ 超时取消订单

延迟消息 生产者把消息发送到消息队列中以后,并不期望被立即消费,而是等待指定时间后才可以被消费者消费,这类消息通常被称为延迟消息。 在RocketMQ中,支持延迟消息,但是不支持任意时间精度的延迟消息,只支持特定级别的延迟消息。 消息延迟级别分别为1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h,共18个级别。 发送延迟消息(生产者) /** * 推送延迟消息 * @param topic * @param

胡大大博主的博客 4603

实现mq延时队列(订单延时取消)

1.RabbitMqConfiguration (mq配置类) @Configuration @Slf4j public class RabbitMqConfiguration{ @Bean public ConnectionFactory connectionFactory(@Value(&quot;${rabbitmq.host}&quot;) String host, @Val...

thver的博客 4907
上一篇: 实战技巧:如何用Frida绕过Anti-Frida检测(附完整脚本)
下一篇: 从ResNet到你的数据集:5步搞定图像分类微调(附PyTorch代码)
糖果HTML
博客等级 码龄3年 76粉丝 1357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值