|
|
b4ec55baf5
|
fix(mq-starter-core): 批量超时缺省时钟改单调源,免受 NTP 回拨影响
review 发现 #3:缺省 clock = System::currentTimeMillis,超时判断是差值
比较(now - batchStartAtMs),墙钟被 NTP 回拨会让差值变负,该批多躺回拨量,
突破"刷出延迟上界一个超时窗口"的文档承诺。
修复:缺省 clock 换 System.nanoTime()/1_000_000(单调,只用于相对差值)。
clock 注入口子不变,既有假时钟测试不受影响。
测试说明:回拨行为单测无法注入(系统时钟不可控),新增缺省时钟冒烟测试
守护纳秒→毫秒换算(错用裸 nanoTime 会让任何批立即被判超时),非严格
TDD RED——超时语义本身已有注入假时钟的用例覆盖。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-15 03:35:18 +01:00 |
|
|
|
7e718dd632
|
docs: review 修复后停机口径同步(README/CLAUDE.md)
- CLAUDE.md:dispatcher 段补打烊拒收 markFail 复位一笔;新增"停机顺序"
约束条目(driver 停(异常吞掉)→ 定时器 shutdown+awaitTermination(30s)
等在途刷批 → 逐监听器 forceFlush → running=false)。
- README:批量坑位说明补"停机瞬间恰有一批在业务方法里跑时,停机等它
跑完,上限 30 秒"。
全景手册(gitignored)已同步更新,不进本 commit。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-15 03:06:30 +01:00 |
|
|
|
e9c149f3bb
|
fix(mq-starter-core): 打烊二次检查拒收时复位 processing 标记
review 发现 #6(终审残余观察①的 follow-up):批量分支锁内的 closed 二次
检查发生在 tryAcquire 之后,拒收抛 InProgress 时去重标记已置 processing
却无人复位。重投每次都撞 stale 标记再抛 InProgress,白烧重试计数直到 TTL
过期;redis-stream 端若 deliveryCount 先超 maxRetry 且未配 errorHandler,
业务一次没跑就被判耗尽、静默丢弃。
修复:锁内只判定拒收,锁外 markFail 复位标记后再抛(markFail 是 Redis 往返,
不进 buffer 锁)。dispatch 入口的打烊快速检查在 tryAcquire 之前,不受影响。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-15 03:00:33 +01:00 |
|
|
|
b735c95879
|
fix(mq-starter-core): 单条监听器显式 batchTimeoutMs=0/负数不再误报 WARN
review 发现 #2:软校验只判 != 60_000,而注解文档明确"0 或负数 = 关闭超时
刷出"。单条监听器显式写 0 语义无害,却触发"配置不生效"WARN 误导运维。
修复:WARN 条件补 batchTimeoutMs > 0,显式关闭(0/负数)不再告警。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-15 02:57:32 +01:00 |
|
|
|
0e8e3762d2
|
fix(mq-starter-core): driver.stop() 异常不再跳过停机强刷尾巴
review 发现 #8:stop() 里 driver.stop() 裸调用,抛异常(如 RocketMQ shutdown
出错/Redis 连接失败)会跳过定时器关闭、全部 forceFlush、running=false——
缓冲里已逐条 ACK 的批直接丢,且 SmartLifecycle 回调没走完会卡 Spring 关闭。
修复:driver.stop() 包 try/catch,异常打 error 日志后继续走完停机流程。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-15 02:55:04 +01:00 |
|
|
|
02469dce11
|
fix(mq-starter-core): stop() 等待在途定时刷批,堵住停机静默丢批缝隙
review 发现 #1:定时线程刚做完超时快照(buffer 已清空)、正在 doFlush 跑业务
方法时优雅停机——shutdown() 不等它,forceFlush() 见空 buffer 直接返回(连
flushLock 都不进),stop 走完后 JVM 退出杀掉 daemon 线程,该批消息早已逐条
ACK,静默丢失。这是终审 shutdownNow→shutdown 的对偶缝隙:温和关闭解决了
"不打断在刷批",但没人等它刷完。
修复:shutdown() 后补 awaitTermination(30s 上界,超时/中断打 WARN 继续停机,
不让挂死的业务方法永久卡住 Spring 关闭)。
测试:往真定时线程塞在途任务模拟"stop 瞬间定时线程正在刷批",断言 stop
返回前任务已完成(修复前该测试失败:stop 立即返回)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-15 02:52:43 +01:00 |
|
|
|
d5161fa650
|
fix(mq-starter-core): 终审两处停机缝隙——dispatcher 打烊拒收 + 定时器温和关闭
1) forceFlush 置 closed:driver.stop() 异步返回后残余线程再投递的消息一律
拒收抛 InProgress(不 ACK、下次启动重投),堵住正常停机丢最后一轮消息的缝隙;
检查先于去重,不留 processing 标记。
2) 定时器 shutdownNow→shutdown:不再打断正在执行的刷出,避免整批被误判失败;
后续执行照常取消,残留批由 forceFlush 接住(flushLock 串行兜底)。
终审 Important #1/#2,处置方案经用户确认。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-15 08:27:10 +08:00 |
|
|
|
b0e0422c10
|
docs: 批量 idle flush 落地后口径同步(README/CLAUDE.md)
批量语义从"无 idle flush、低频停滞、重启丢批"改为"超时(缺省 60s)/停机
强制刷出,仅 kill -9 丢未满批";注解属性表补 batchTimeoutMs 行,TODO 勾选。
全景手册(docs/,gitignored)已同步修改,不在本 commit。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 15:07:21 +01:00 |
|
|
|
244d4d3854
|
feat(mq-starter-core): MqListenerRegistry 接线批量超时刷出定时器 + 停机强刷残留批
有"批量且 batchTimeoutMs>0"监听器才建全局单线程 daemon(mq-batch-flush)
每 1s 扫描 flushIfTimeout,任务体逐个 catch-all 防调度线程死亡;stop 顺序
改为 driver 停→定时器停→forceFlush 残留→running=false,正常停机不丢未满批。
两 driver 零改动,redis-stream/rocketmq 同时受益。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 21:55:39 +08:00 |
|
|
|
20f06613e8
|
feat(mq-starter-core): MqConsumeDispatcher 批量超时/停机强制刷出(idle flush)
从本批首条进入缓冲起算(linger 语义),flushIfTimeout 到点刷未满批、
forceFlush 停机非空即刷,均汇入 doFlush;时钟经 Builder 注入,单测用
假时钟全覆盖(不真等待)。Builder 缺省 batchTimeoutMs=0 保持旧行为。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 14:47:26 +01:00 |
|
|
|
98731c3591
|
refactor(mq-starter-core): 抽取 doFlush 统一批量刷出路径 + flushLock 串行化业务调用
为 idle flush 铺路:满批/超时/停机三路径将共用同一刷出段,失败语义只写一份。
flushLock 使业务批量方法任一时刻至多一个调用(rocketmq 端原有多满批并发刷
顺带收紧为串行,设计已确认)。行为对既有测试不变。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 20:56:08 +08:00 |
|
|
|
ad864e5b93
|
feat(mq-starter-core): @MqListener 新增 batchTimeoutMs(批量超时刷出,缺省 60s)+ 启动软校验
字段仅批量监听器生效;batchSize<=1 且显式配非缺省值时打 WARN 不阻断
(延续 batchSize 软校验风格;恰好显式写 60000 检测不出,已知可接受)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 20:49:48 +08:00 |
|
|
|
cfe9d0e994
|
style(driver): 两 driver 运行期日志与异常文案中文化
纯文案改动,无逻辑变化;关键消费路径日志(毒消息 ACK/InProgress 留投/重试耗尽)
统一为中文口径,便于业务侧排查。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 13:04:28 +01:00 |
|
|
|
ec5b22b392
|
docs: 去重默认开启口径落文档 + 异构发送方对接契约 + tag 用法教学
README:idempotent 默认 true 全文对齐(快速开始加 spring.redis、能力表、注解属性表、
troubleshooting 加「只有第一条能消费」条目);新增「Redis Stream 消息结构」一节
(五字段信封、enc=plain/gzip、key 逐条唯一契约、rocketmq 端 KEYS 属性补注);
新增 tag 小节(broker 过滤 vs redis-stream 全收)。
CLAUDE.md:装配链路第 2 条改为「默认调用 store、Redis 不可达在消费期暴露」口径。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 13:04:08 +01:00 |
|
|
|
94d5de5182
|
feat(mq-starter-core): @MqListener idempotent 默认值翻转为 true——去重默认开启
不需要去重的监听器显式 idempotent=false,或 mq.idempotent.enabled=false 全局关;
Registry 无 store 时的 WARN 文案同步改为默认开启口径。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 13:02:44 +01:00 |
|
|
|
0f7be86bb8
|
docs(CLAUDE.md): 2026-07-14 复核对齐——batchSize 软校验决策 + 三处口径补正
- 方法签名约束:记录 batchSize 与首参 List 错配只打 WARN 不阻断(刻意软校验,走不走批量只由首参决定)
- 失败落库口径:单条/批量落库均仅在配了 errorHandler 时发生(safeOnError 对 null handler 静默跳过);MqConsumeErrorHandler 标注可选、未配则任何失败仅 ACK 丢弃
- InProgress 白跑烧重试计数改记为两端共性(rocketmq reconsumeTimes / redis-stream PEL delivery),缓解同构:processing-ttl < maxRetry 轮重投累计时长
- fail-fast 校验补充:仅显式配 mq.type 时介入,缺省落 rocketmq 时三层校验不触发(已知遗留)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 04:19:36 +01:00 |
|
|
|
8c39399d09
|
feat(mq-starter-core): @MqListener batchSize 与首参 List 错配时打 WARN 软校验
走不走批量始终只由首参是否 List 决定,错配不阻断启动:
- batchSize>1 但首参非 List → WARN 提示 batchSize 不生效、按单条逐一回调
- 首参 List 但 batchSize<=1 → WARN 提示将按 1 条一批回调
测试:ListAppender 捕获日志,覆盖两个错配方向 + 匹配时无 WARN。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 04:19:17 +01:00 |
|
|
|
14502449aa
|
docs(README): 承接全景手册上手教学——手册删教学 tab 后 README 成为唯一上手入口
- 发送语义:fastjson 序列化约束(无参构造+getter/setter)、send 同步/失败抛异常、反序列化失败两端行为(redis-stream ACK 丢弃/rocketmq 重试到耗尽)
- 批量的坑:裸 List 启动报错、无 idle flush、整批失败被吞须配 errorHandler、可加 MqContext 第二参
- 新增「排错 FAQ」章节(8 问,自手册 FAQ 改写)
- 配置表小补:fail-ttl 语义、redis-stream.* 底层配置来源
- 架构章节指向手册的描述改为架构图文/能力矩阵/Roadmap(配置速查与 FAQ 不再在手册)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-14 11:14:30 +08:00 |
|
|
|
5191f5ace9
|
docs(README): batchSize 能力格对齐全景手册——两端一致(core 内存攒批/no idle flush/重启丢未满批),纠正 redis 侧 ✅ 伪差异
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-10 15:33:53 +08:00 |
|
|
|
3c14b0cca3
|
docs(README): SINGLE 失败落库口径对齐全景手册——两端一致(单条落库+重投/批量失败被吞),纠正 rocketmq 记错的 RECONSUME_LATER 伪差异
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-10 15:12:02 +08:00 |
|
|
|
96e26c9bbb
|
docs: README/CLAUDE.md 对齐 rocketmq 消费去重落地——能力表 ❌→✅、新模块 mq-starter-idempotent-redis、mq.idempotent.* 配置、纠正序列化过时表述
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 13:18:09 +08:00 |
|
|
|
e2a956edb1
|
feat(mq-spring-boot-starter): 聚合 jar 引入 mq-starter-idempotent-redis,rocketmq 部署开箱可用消费去重
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 11:58:40 +08:00 |
|
|
|
e6ea14046c
|
refactor(mq-starter-redis-stream): 去重 store 与 idempotent 配置迁至 mq-starter-idempotent-redis,模块改为依赖之
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 11:50:37 +08:00 |
|
|
|
b449c26356
|
feat(mq-starter-idempotent-redis): 旧键 mq.redis-stream.idempotent.* Binder 逐键回退兼容 + 聚合弃用告警
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 11:34:21 +08:00 |
|
|
|
f558f6303e
|
feat(mq-starter-idempotent-redis): mq.idempotent.* 中立配置 + 不按 mq.type 门控的去重 store 自动装配
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 03:12:06 +01:00 |
|
|
|
c2a31c9339
|
feat(mq-starter-idempotent-redis): 新建 driver 中立去重模块,迁入 RedisMqIdempotentStore 及其测试
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 10:04:10 +08:00 |
|
|
|
f4793b10c0
|
fix(mq-starter-rocketmq): 消费捕获 MqMessageInProgressException 返回 RECONSUME_LATER,杜绝处理中消息被耗尽落库+ACK 静默丢弃
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 02:54:09 +01:00 |
|
|
|
ae0caafa63
|
docs(mq-starter): 重写 README + 新增 CLAUDE.md,gitignore docs/
- README 重写为面向使用者的完整说明(快速开始/配置项/两 driver 能力对照/架构/TODO)
- 新增 CLAUDE.md:补代码结构、装配链路、消费 ACK 语义等踩坑点,供 Claude Code 参考
- .gitignore 忽略 docs/(AI 生成的本地参考/教学资料,不纳入版本库)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-09 20:41:54 +08:00 |
|
|
|
29473e6fef
|
feat(mq-starter-rocketmq): 重试耗尽回调 retryExhaustedHandler 落库并 ACK,maxRetry 对齐 @MqListener
对齐 redis-stream 的 reclaim 耗尽语义,兑现"换 MQ 业务不动"契约:此前 rocketmq
只有 broker 默认 16 次重投、无 RETRY_EXHAUSTED 落库。
- setMaxReconsumeTimes 对齐 @MqListener(maxRetry)(缺省 3),不再用 broker 默认 16
- 抽出 consumeBatch:reconsumeTimes 达 maxRetry 时回调 retryExhaustedHandler 落库并 ACK 终止;未达则 RECONSUME_LATER
- onRetryExhausted 落库 best-effort:毒消息 payload 反序列化失败时留 null、至少保留 key/tag,并隔离 handler 自身异常
- 补消费逻辑单测(耗尽落库 / 未耗尽重投 / 成功投递)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-09 20:41:39 +08:00 |
|
|
|
84034fb7d0
|
feat(mq-starter-redis-stream): 去重 TTL / reclaim idle 外置为 mq.redis-stream.* 可配置
原先 reclaim idle 与去重 TTL/前缀硬编码在 autoconfig 里,按业务处理时延调优只能改源码。
- 新增 RedisStreamMqProperties(前缀 mq.redis-stream):reclaim-min-idle + idempotent.{key-prefix,processing/success/fail-ttl}
- 默认值与历史硬编码完全一致(reclaim 30s / processing 60s / success 300s / fail 300s / mq:idem:),不改变现有行为
- autoconfig 改由 Properties 取值装配 driver 与 RedisMqIdempotentStore
- 补默认值一致性 + mq.redis-stream.* 绑定覆盖单测;wiring 测试改按方法名反射以适配新签名
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-09 20:41:21 +08:00 |
|
|
|
e660afe2a2
|
fix(mq-starter): 去重跳过区分 processing/success,processing 残留不 ACK 避免静默丢消息
tryAcquire 返回 false 的两类跳过此前一律静默 return,导致 driver 无差别 ACK:
消费者在 markSuccess/markFail 前崩溃残留的 processing 标记,会被当成"已处理"
而 ACK,该消息从未成功消费却被丢弃(Critical 静默丢消息)。
- MqIdempotentStore 新增 isCompleted(key),默认 true 保持旧行为,状态机实现须覆写
- MqConsumeDispatcher:跳过时按 isCompleted 分流——success 正常 return 让 driver ACK;
仍 processing 则抛 MqMessageInProgressException(新,纯控制流信号、不带栈)让 driver 不 ACK
- RedisMqIdempotentStore.isCompleted 仅 success 视为完成;RedisStreamMqDriver 捕获信号异常时留 PEL 待重投
- 补 dispatcher 两类跳过 + store isCompleted 语义单测
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-09 20:41:02 +08:00 |
|
|
|
886c02ff96
|
fix(mq-starter): 修复启动 fail-fast 校验 review 发现的缺陷(relaxed binding / 逃生开关 / redis 假地址)
workflow 多智能体 review 后修复:
- rocketmq 探测改用 Binder 读 rocketmq.name-server,与 driver(RocketMQProperties)同源、
享受 relaxed binding,修复 camelCase(rocketmq.nameServer) 被误判为「未配置」而错误 fail-fast
- MqStartupChecks 逃生开关只认严格 false(忽略大小写/空白),缺省或非法值一律继续校验,
不再因非法布尔值(如 enabled=disabled)抛类型转换异常炸掉启动
- redis 探测 target() 对 cluster/sentinel 回退到指向真实配置项的文案,
不再假报使用者从未配过的 localhost:6379
- 补齐回归测试:camelCase 键 / 非法开关值继续校验 / host:port 提示分支 / cluster 回退
(core 5、redis-stream 5、rocketmq 5,全绿)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-09 14:06:05 +08:00 |
|
|
|
0c6d37842e
|
fix(mq-starter-rocketmq): 导入 spring-boot BOM 统一 spring 版本(修既有 5.2.15↔5.3 裂开,Task3 测试可运行)
|
2026-07-09 11:20:24 +08:00 |
|
|
|
d7ef8b5626
|
feat(mq-starter-rocketmq): 启动期 TCP 探测 NameServer 连通性(①② fail-fast)
|
2026-07-09 11:05:00 +08:00 |
|
|
|
46b0c13462
|
feat(mq-starter-redis-stream): 启动期 PING 探测 Redis 连通性(①② fail-fast)
|
2026-07-09 10:49:23 +08:00 |
|
|
|
5c4a29e1e1
|
feat(mq-starter-core): 启动期校验 mq.type 有对应 MqDriver(③ fail-fast)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-09 10:34:50 +08:00 |
|
|
|
bd2e733d98
|
Merge: mq-starter 消费侧通用化 + redis-stream 可放量(去重/批量/异常落库/重试 reclaim + opus review 修复)
|
2026-06-29 20:51:59 +08:00 |
|
|
|
f0dc785998
|
fix(mq-starter): 落实 opus review 反馈(含 1 个 Critical 静默丢消息)
- [Critical] dispatcher errorHandler 抛异常时仍保证 markFail + 抛原始异常(safeOnError 隔离):
否则去重标记停在 processing,reclaim 重投被去重挡掉并 ACK → 静默丢消息
- [Important] 重试耗尽回调携带完整 payload(reclaim 解码 body,不再传 null)
- [Important] reclaim 默认 idle 5s→30s,避免多实例误 reclaim in-flight 消息;注释 at-least-once 语义
- [Important] idempotent=true 但无 MqIdempotentStore bean 时 start() 告警
- core 引入 slf4j-api(provided);批量失败 / errorHandler 失败均记日志
- errorHandler bean 未找到时抛带 topic/group 的清晰错误
- 文档化已知限制(批量无 idle flush、去重 fail→reopen 非原子)
- 全仓 29 测试绿(含连真实 redis 的 IT)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-29 20:48:53 +08:00 |
|
|
|
dd2b933c08
|
feat(mq-starter): redis-stream 重试可放量(PEL reclaim + 超限落库)
- 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>
|
2026-06-29 20:17:05 +08:00 |
|
|
|
407df30457
|
feat(mq-starter-redis-stream): 去重 Redis 默认实现 RedisMqIdempotentStore
- 实现 MqIdempotentStore:setIfAbsent 原子占用 + processing/success/fail 状态机 + TTL
- 修正 legacy 读写 key 不一致缺陷(读写统一前缀键)
- autoconfig 在 redis-stream 模式装配为默认 store(@ConditionalOnMissingBean)
- 集成测试连真实 redis 验证状态机;@Bean 声明契约护栏
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-29 19:59:07 +08:00 |
|
|
|
4ee6685cc5
|
feat(mq-starter-core): 消费侧通用化 去重/批量/异常落库(注解+SPI 织入)
- 新增 MqConsumeDispatcher 消费处理链:去重→(攒批)→业务→成功标记/异常落库
- 新增 SPI:MqIdempotentStore(去重,修正 legacy 读写 key 不一致缺陷)、
MqConsumeErrorHandler + MqErrorIdentity(异常落库 SINGLE/RETRY_EXHAUSTED)
- @MqListener 扩展 idempotent/errorHandler;BPP 识别 List<T> 批量签名并解析元素类型
- MqListenerRegistry 织入 dispatcher,按注解装配 store/errorHandler;
autoconfig 经 ObjectProvider/ApplicationContext 注入(4 参构造,保留 2 参重载)
- 重试统一交 driver MQ 原生重投(单条异常 rethrow);批量入库失败落库后吞掉不卡队列
- 19 个单测全绿(-DforkCount=0)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-29 19:49:22 +08:00 |
|
|
|
e5991718e6
|
test(mq-starter): driver autoconfig 加 @AutoConfigureBefore 注解契约护栏
Rocket / RedisStream driver autoconfig 各加一个护栏测试,断言
@AutoConfigureBefore(MqCoreAutoConfiguration) 注解存在——防止重构误删导致 core 在
driver 前装配、MqTemplate/MqListenerRegistry 不装配的回归(最终 review I1)。
以注解契约守护、不 refresh context(规避本模块 spring 版本不一致:rocketmq-spring
2.2.3 与父 pom spring-boot 2.3.12 的 spring-core 缺 ApplicationStartup);真实装配
结果由 cn-data-platform MqSliceWiringTest 在正确 spring 版本下覆盖。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-29 14:08:26 +08:00 |
|
|
|
9f6ffad77c
|
fix(mq-starter): driver autoconfig 加 @AutoConfigureBefore(MqCoreAutoConfiguration)
真实 autoconfig 顺序按类名字母序,com.njcn.mq.autoconfig.MqCoreAutoConfiguration
先于 com.njcn.mq.driver.* 处理,core 的 @ConditionalOnBean(MqDriver) 在 driver
bean 注册前求值失败,导致 MqTemplate / MqListenerRegistry 在真实应用中均不装配。
两个 driver autoconfig 各加 @AutoConfigureBefore(MqCoreAutoConfiguration.class),
保证 driver 先于 core 装配。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-29 12:01:41 +08:00 |
|
|
|
f2ea48dce0
|
feat(mq-spring-boot-starter): 聚合三模块,业务方单坐标接入
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 05:30:28 +08:00 |
|
|
|
597b872b4f
|
feat(mq-starter-rocketmq): rocket driver 发送(模板)+编程式消费(DefaultMQPushConsumer)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 05:25:55 +08:00 |
|
|
|
acc745c52e
|
feat(mq-starter-redis-stream): redis driver 复用 Phase1 低层件 + 薄收发循环
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 05:17:27 +08:00 |
|
|
|
795d4f2629
|
feat(mq-starter-core): 自动装配 + spring.factories
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 05:06:36 +08:00 |
|
|
|
016590099a
|
feat(mq-starter-core): MqListenerRegistry 端点→driver.subscribe + payload/MqContext 调用
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 04:58:59 +08:00 |
|
|
|
744115ca97
|
feat(mq-starter-core): @MqListener 扫描 → MqListenerEndpoint
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 04:53:01 +08:00 |
|
|
|
871aef64f8
|
feat(mq-starter-core): 发送门面 MqTemplate + DefaultMqTemplate
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-26 04:48:19 +08:00 |
|