unbridled-41 opened a new pull request, #4269:
URL: https://github.com/apache/rocketmq-dashboard/pull/4269
Fixes #4268.
## Source
- 父项目(master 经典版)DLQ
消息详情弹窗展示重投次数:`frontend-new/src/components/DlqMessageDetailViewDialog.jsx` L47
—— `ReconsumeTimes`(`git show origin/master:` 亲验)。
- 语义依据:死信经 `%RETRY%` 组重试后仍失败才进入 `%DLQ%` 主题,消息上携带的 reconsumeTimes
即死信前的消费重试次数(rocketmq-common 5.5.0 `MessageExt.getReconsumeTimes()`,javap 字节码亲验)。
## Current gap
Studio DLQ 明细抽屉(`web/src/pages/instance/dlq.tsx` detailColumns)只显示 Message
ID / Queue / Offset / 入队时间 / Keys / Body / 属性(#3999)/ 操作,不含重投次数。后端扫描死信时已直接持有
`MessageExt`,`RocketMQDLQProvider.toExportVO` 是 list/export/exportExcel 三条路径的唯一
VO 映射点,但未映射该字段,`DLQMessageVO` 也没有该属性。
## Project fit
- DLQ 分诊是本产品消费运维的核心场景;重投次数决定处理策略(直接重发 / 排查消费逻辑 / 放弃)。
- 最小实现:一个 VO 字段 + 一处映射 + 一列展示;Excel 导出行(`DLQMessageExcelRow`)保持现状不动,不改变导出契约。
## Scope
- 包含:`DLQMessageVO.reconsumeTimes`、`RocketMQDLQProvider.toExportVO` 填充、DLQ
明细抽屉"重投次数"列、TS 类型(`reconsumeTimes?: number`,兼容 mock 与旧响应)。
- 不包含:Excel 导出新列、重发结果对话框、云厂商 provider(其 DLQ 列表路径本身未实现)。
## Implementation
- `server/.../instance/dlq/DLQMessageVO.java`:新增 `private int
reconsumeTimes;`
- `server/.../provider/apache/RocketMQDLQProvider.java`:`toExportVO` 增加
`.reconsumeTimes(message.getReconsumeTimes())`
- `web/src/api/message.ts`:`DLQMessage` 新增可选 `reconsumeTimes`
- `web/src/pages/instance/dlq.tsx`:明细抽屉 Offset 列后新增"重投次数"列(`?? '-'` 占位)
## Tests
- 后端新回归 `listMessagesShouldCarryReconsumeTimes`(RocketMQDLQProviderTest):死信
`setReconsumeTimes(3)`,断言 listMessages 返回值 `getReconsumeTimes()==3`。
- 红灯:`mvn -o test-compile` → `cannot find symbol`(DLQMessageVO 无
getReconsumeTimes,test :407)。
- 绿灯:`RocketMQDLQProviderTest 35/35`(34 基线 + 1 新增)。
- 前端新回归 `shows the retry count in the DLQ message
drawer`(DLQPage.test.tsx):断言"重投次数"列头与行内值 3。
- 红灯:`Tests 1 failed | 19 passed (20)`(Unable to find 重投次数)。
- 绿灯:`Tests 20 passed (20)`(列头断言按 antd 表头双渲染惯例用 findAllByText)。提交后复跑 20/20。
- 全量后端:`mvn -o clean test` → `2152 tests, failures=2`(= pristine 2151 + 1
新增;2 失败为基线 AuthCorsIntegrationTest ×2,逐字相同,零新增失败。注:不带 clean 的首跑显示 2154 为 target
陈旧测试类污染,clean 后核实)。
- 全量 web:`npx vitest run` → `982 tests (981 pristine + 1 新增), 2 failed | 980
passed`,两轮失败均为 MetricsExplorer 1 + ConsumerPage 1(未触碰文件的已知负载脆弱族;DLQPage 隔离
20/20)。
- `npx tsc -b` 干净(exit 0);`npx eslint`(3 个改动文件)0 error(dlq.tsx:82 仅基线既有
react-refresh warning,stash 对照核实);`npm run build` ✓(9.97s)。
## Compatibility & Risk
- `DLQMessageVO` 加字段为向后兼容(响应新增键);TS 类型标记可选,旧 mock/响应不破坏。
- reconsumeTimes 为 int 原始类型:Apache 路径始终有真实值;未来若接云厂商 DLQ,缺省 0 语义与
`queueId(0)` 先例一致(当前云厂商无 DLQ 列表路径)。
- 风险极低:展示层追加 + 单字段映射。
## Diff
6 files, +67/−0(numstat:DLQMessageVO +1、RocketMQDLQProvider
+1、RocketMQDLQProviderTest +22、message.ts +1、DLQPage.test.tsx +33、dlq.tsx
+9)。head: 776a49b4。
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]