paascloud-master中消息队列延迟队列:RocketMQ定时消息实现
一、定时消息应用场景
在电商系统中,订单超时未支付自动取消、优惠券到期提醒等场景都需要用到延迟队列功能。paascloud-master基于RocketMQ实现了定时消息机制,通过设置消息延迟级别实现定时投递。核心实现位于Tpc模块,主要涉及消息生产者配置、延迟级别定义和发送流程控制。
二、延迟队列核心实现
2.1 延迟级别定义
系统通过枚举类统一管理延迟级别,对应RocketMQ的18个预设延迟等级(1s~2h)。代码定义如下:
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类中实现:
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方法传递延迟级别参数,完成定时消息发送:
this.directSendMessage(message.getMessageBody(), message.getMessageTopic(),
message.getMessageTag(), message.getMessageKey(),
message.getProducerGroup(), message.getDelayLevel());
三、使用方式与注解支持
3.1 注解式延迟配置
通过自定义@MqProducerStore注解可快速配置消息生产者及延迟级别:
@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 消息发送流程图
四、异常处理与重试机制
4.1 发送重试逻辑
生产者实现了失败重试机制,默认重试3次:
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-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mq/RocketMqProducer.java
- 延迟级别枚举:paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/DelayLevelEnum.java
- 消息服务实现:paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqMessageServiceImpl.java
- 生产者注解:paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/annotation/MqProducerStore.java
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



