dd2b933c08d27e632970f814488cebd30c21e200
- MqSubscription 增加 retryExhaustedHandler;registry 从 errorHandler 接线 RETRY_EXHAUSTED 回调 - redis driver 每轮 reclaim PEL:connection 层 xClaim 认领超 idle 消息并使 delivery+1 - delivery <= maxRetry:重投消费,成功 ACK / 失败留 PEL - delivery > maxRetry:回调 retryExhaustedHandler 落库 + ACK 终止,不再卡队列 - 可配 reclaimMinIdleMs(默认 5000ms,对齐 legacy 5s 延迟);4 参构造 + 3 参重载 - 集成测试连真实 redis 验证 重试耗尽→落库→ACK;全仓 28 测试绿 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mq-starter — 统一 MQ 抽象层("MQ 界的 JDBC")
一个独立、全平台通用的 starter。业务配一行 mq.type 选底层(rocketmq | redis-stream),
只面向 starter 接口编程,不关心用哪个 MQ、不管理生产者消费者;换 MQ = 改配置,业务代码一行不动。
- 坐标 groupId:
com.njcn,版本1.0.0-SNAPSHOT(Phase 2 阶段本地mvn install) - JDK 1.8 / Spring Boot 2.3.12.RELEASE /
META-INF/spring.factories自动装配 - 零业务依赖:不依赖
message-api等任何业务模块
业务视角(对外契约)
mq:
type: redis-stream # 或 rocketmq
// 发
@Resource MqTemplate mq;
mq.send("LN_Topic", payload);
mq.send("File_Topic", nodeId, payload); // 带路由 key
// 收(业务方法打注解,零 MQ 概念)
@MqListener(topic = "LN_Topic", group = "ln_consumer")
public void onFrontData(FrontData msg) { /* 纯业务 */ }
模块结构
| 模块 | 职责 |
|---|---|
mq-starter-core |
门面 MqTemplate + @MqListener 注解扫描 + 中立信封 MqMessage + driver SPI + 生命周期 |
mq-starter-rocketmq |
rocket driver(基于官方 rocketmq-spring 编程式注册) |
mq-starter-redis-stream |
redis driver(复用 redis-stream-springboot-starter 低层件,零改动 Phase 1) |
mq-spring-boot-starter |
聚合 jar,业务方只引这一个坐标 |
装配机制
@ConditionalOnProperty("mq.type") 静态二选一:两套 driver 各只在对应值下装配,
同一上下文只存在一个 MqDriver bean。
关联设计
- 设计稿:
cn-data-platform/docs/superpowers/specs/2026-06-25-mq-starter-design.md - 能力清单与轻量版范围:
cn-data-platform/docs/2026-06-25-mq-starter能力清单与轻量版范围.html - 实现计划(轻量版 Phase 2):
cn-data-platform/docs/superpowers/plans/2026-06-25-mq-starter-轻量版-phase2.md
Description
Languages
Java
100%