feat(mq-starter-core): 同 group 订阅 tag 不一致启动 fail-fast,病态 tag 表达式打 WARN
同组配不同 tag 时消息只投组内某一个消费者,不匹配方直接 ACK 吞掉、另一方 永远收不到(订阅关系不一致,静默丢消息级事故,README 原本只靠文字约定)。 现在注解扫描期强校验:同一 group 声明不等价的 tag 表达式直接 IllegalStateException, 报错点名 group、冲突表达式与两个方法。等价性按 MqTagMatcher.validParts 有效 tag 集合比较("A || B" 与 "B||A" 等价,*/空/病态式同为全收),只覆盖单应用内。 - MqTagMatcher 新增 validParts / looksMisconfigured,matches 重构为基于 validParts,解析口径单一来源(每消息多一次小集合分配,可忽略) - 病态表达式("||"、纯空白:写了内容却解析不出有效 tag)扫描期打 WARN 不阻断, redis 端静默全收 vs rocketmq 端行为不同的分叉维持现状(拍板记录不修) - README tag 小节、CLAUDE.md 签名约束一节同步 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -85,6 +85,7 @@ driver 只需实现 `MqDriver`(`send` / `subscribe` / `stop`)。其余是可
|
||||
- `batchSize > 1` 时首参要用 `List<T>`,且**必须声明具体元素类型**(`List<FrontData>`,不能裸 `List`)—— driver 仍按 `T` 逐条反序列化,dispatcher 负责攒批。
|
||||
- `batchSize` 与首参是否 `List` 的**错配只打 WARN、不阻断启动**(2026-07-14 决策,刻意软校验):走不走批量始终只由首参决定——`batchSize>1` 配单 payload 按单条跑,`List` 首参配 `batchSize<=1` 按 1 条一批跑。
|
||||
- `batchTimeoutMs` 仅批量监听器生效;`batchSize<=1` 且显式配了非缺省值时同样只打 WARN 软校验、不阻断(恰好显式写 60000 检测不出,已知可接受)。
|
||||
- **同 group 订阅 tag 一致性强校验**(2026-07-16):同一 group 声明不等价的 tag 表达式直接抛 `IllegalStateException`(订阅关系不一致 = 静默丢消息;等价性按 `MqTagMatcher.validParts` 有效 tag 集合比较,`*`/空/病态式同为全收不算冲突)。只覆盖单应用内,跨应用/滚动发布窗口的不一致防不住。病态表达式(写了内容却解析不出有效 tag,如 `"||"`、纯空白)只打 WARN 不阻断——redis 端全收 vs rocketmq 端行为不同的分叉本身维持现状(2026-07-16 拍板记录不修)。
|
||||
|
||||
## 启动期 fail-fast 校验(近期新增,改动时留意)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user