paascloud-master中消息队列延迟队列:RocketMQ定时消息实现

paascloud-master中消息队列延迟队列:RocketMQ定时消息实现

【免费下载链接】paascloud-master spring cloud + vue + oAuth2.0全家桶实战,前后端分离模拟商城,完整的购物流程、后端运营平台,可以实现快速搭建企业级微服务项目。支持微信登录等三方登录。 【免费下载链接】paascloud-master 项目地址: https://gitcode.com/gh_mirrors/pa/paascloud-master

一、定时消息应用场景

在电商系统中,订单超时未支付自动取消、优惠券到期提醒等场景都需要用到延迟队列功能。paascloud-master基于RocketMQ实现了定时消息机制,通过设置消息延迟级别实现定时投递。核心实现位于Tpc模块,主要涉及消息生产者配置、延迟级别定义和发送流程控制。

二、延迟队列核心实现

2.1 延迟级别定义

系统通过枚举类统一管理延迟级别,对应RocketMQ的18个预设延迟等级(1s~2h)。代码定义如下:

paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/DelayLevelEnum.java

public enum DelayLevelEnum {
    ZERO(0, "不延迟"),
    ONE(1, "1秒"),
    TWO(2, "5秒"),
    THREE(3, "10秒"),
    FOUR(4, "30秒"),
    FIVE(5, "1分钟"),
    SIX(6, "2分钟"),
    SEVEN(7, "3分钟"),
    EIGHT(8, "4分钟"),
    NINE(9, "5分钟"),
    TEN(10, "6分钟"),
    ELEVEN(11, "7分钟"),
    TWELVE(12, "8分钟"),
    THIRTEEN(13, "9分钟"),
    FOURTEEN(14, "10分钟"),
    FIFTEEN(15, "20分钟"),
    SIXTEEN(16, "30分钟"),
    SEVENTEEN(17, "1小时"),
    EIGHTEEN(18, "2小时");
    
    private final int delayLevel;
    private final String value;
    
    // getter/setter省略
}

2.2 消息发送实现

RocketMQ生产者通过setDelayTimeLevel方法设置延迟级别,核心发送逻辑在RocketMqProducer类中实现:

paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mq/RocketMqProducer.java

public static SendResult sendSimpleMessage(String body, String topic, String tag, String key, String pid, Integer delayLevel) {
    if (delayLevel == null) {
        delayLevel = 0;
    }
    Message message = MqMessage.checkMessage(body, topic, tag, key);
    if (delayLevel < 0 || delayLevel > GlobalConstant.Number.EIGHTEEN_INT) {
        throw new TpcBizException(ErrorCodeEnum.TPC100500013, topic, key);
    }
    message.setDelayTimeLevel(delayLevel);  // 设置延迟级别
    return retrySendMessage(pid, message);
}

2.3 业务层调用

在消息服务实现类中,通过directSendMessage方法传递延迟级别参数,完成定时消息发送:

paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqMessageServiceImpl.java

this.directSendMessage(message.getMessageBody(), message.getMessageTopic(), 
                      message.getMessageTag(), message.getMessageKey(), 
                      message.getProducerGroup(), message.getDelayLevel());

三、使用方式与注解支持

3.1 注解式延迟配置

通过自定义@MqProducerStore注解可快速配置消息生产者及延迟级别:

paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/annotation/MqProducerStore.java

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MqProducerStore {
    String topic();
    String tag() default "";
    String producerGroup();
    DelayLevelEnum delayLevel() default DelayLevelEnum.ZERO;  // 延迟级别默认不延迟
    boolean isSaveDB() default true;
}

3.2 消息发送流程图

mermaid

四、异常处理与重试机制

4.1 发送重试逻辑

生产者实现了失败重试机制,默认重试3次:

paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mq/RocketMqProducer.java

private static SendResult retrySendMessage(String pid, Message msg) {
    int iniCount = 1;
    SendResult result;
    while (true) {
        try {
            result = MqProducerBeanFactory.getBean(pid).send(msg);
            break;
        } catch (Exception e) {
            log.error("发送消息失败:", e);
            if (iniCount++ >= PRODUCER_RETRY_TIMES) {
                throw new TpcBizException(ErrorCodeEnum.TPC100500014, msg.getTopic(), msg.getKeys());
            }
        }
    }
    return result;
}

4.2 错误码定义

系统定义了专门的消息发送错误码,如延迟级别超限(TPC100500013)、发送失败(TPC100500014)等,具体可参考错误码枚举类

五、核心模块路径汇总

【免费下载链接】paascloud-master spring cloud + vue + oAuth2.0全家桶实战,前后端分离模拟商城,完整的购物流程、后端运营平台,可以实现快速搭建企业级微服务项目。支持微信登录等三方登录。 【免费下载链接】paascloud-master 项目地址: https://gitcode.com/gh_mirrors/pa/paascloud-master

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值