## 现状与设计问题 当前 `Messager` 保存 GotchaContext,`send` 克隆自身并直接调用 message.handle,`spawn` 则转交 tokio::spawn 后丢弃句柄。没有队列、背压、重试或独立执行边界。 这些能力不一定都应加入;需要先确认相对普通 async 服务方法,这层框架抽象要提供的独特价值。 ## 代码位置 静态审查: - [gotcha/src/message.rs:39](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/message.rs#L39) - [gotcha/src/message.rs:60](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/message.rs#L60) - [gotcha/src/message.rs:98](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/message.rs#L98) - [gotcha/src/lib.rs:45](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/lib.rs#L45) ## 建议范围 先做有结论的 API 设计与文档 PR:明确它是携带上下文的 typed command dispatch,还是需要更强的后台执行语义。评估保留、简化或移出默认核心;不要为了证明封装价值而添加尚无需求的消息基础设施。 ## 验收标准 - [x] 用实际调用案例说明比普通 async 方法多提供的价值。 - [x] 明确 send 是否排队、执行位置、错误与取消传播;明确 spawn 为何/是否 detached。 - [x] 给出保留、简化或迁移的决策及兼容方案。 - [x] 与计划任务统一生命周期的交互被明确考虑。 - [x] 不在缺少使用需求时额外引入队列、重试等机制。 本项是待决策的设计工作,不是已证实的功能错误。 ## 当前版本复查与已批准方案 基于 PR #113 合入后的 main `165c9db6cec3efa0d50d75bba0754b11c5d2d4d5` 复查: - `send` 克隆上下文后直接 await `Message::handle`,不排队、不创建独立 Tokio task;结果、错误(作为 Output 的一部分)、panic 和取消沿调用方 future 传播。 - `spawn` 只接受 `Output = ()`,内部调用 `tokio::spawn` 后丢弃 `JoinHandle`;调用方不能通过该 API 等待完成、读取结果/任务失败或取消任务。 - 仓库的 `examples/message` 展示了 HTTP handler 提取上下文、执行消息、消息再触发消息。它提供统一的命令类型和上下文传递约定;普通 async 服务方法同样可以表达这些业务,不必强制使用 Message。 - PR #112 已管理计划任务生命周期,但应用自行创建的消息任务没有加入该所有权,MIGRATION 已明确这一边界。 建议保留这个轻量封装和现有导出,明确其定位为携带应用上下文的类型化命令调用。用户已批准以下范围,已实现于 PR #114: 1. 保持 `send` 的直接执行语义,补充执行位置、Result/panic 和取消传播说明。 2. 将 `spawn` 改为 `pub fn spawn<M: Message<S, C>>(&self, message: M) -> tokio::task::JoinHandle<M::Output>`,让调用方获得等待结果、观察 JoinError 和取消任务的入口,不添加额外 task 或消息队列。 3. 明确丢弃 JoinHandle 仍会 detach,不会自动取消,也不会自动加入应用 shutdown;需要完成保障的工作由调用方持有并等待,或在已有受管理的计划任务内直接 await `send`。 4. 更新可编译示例、迁移说明和针对执行/取消/失败契约的必要测试,不重复现有上下文读取测试。 兼容影响:一般带分号的旧调用仍可运行;依赖 `spawn` 返回 `()` 的尾表达式或函数签名需要调整。旧的 detached 使用可以显式丢弃返回句柄;新代码可使用返回值保留执行控制。 PR #114 已由用户合入,合入 commit 为 `7cea0fef855cd0b16a3df2d101a1f26a8cc92d09`。不新增队列、背压或重试,也不更改计划任务的所有权设计。 ## 实现与验证 - `spawn` 直接返回已有 `tokio::spawn` 的 `JoinHandle<M::Output>`,去掉 `Output = ()` 限制。 - README、模块及方法文档明确 Message/Messager 的类型化命令定位、结果/失败传播和取消边界;示例改为等待 spawn 的结果并展示嵌套 send。 - MIGRATION 记录返回类型变更,以及 drop 仍会 detach、abort 后需要 await、应用 shutdown 不接管这些任务的边界。 - 保留原有上下文测试,新增 4 项测试:结果/错误与 panic 边界、无 runtime 的惰性直接执行及 drop 取消、abort 并 join、drop handle 后继续执行。 - 本地 gotcha 默认/all-features 测试(含 doctest)、message 示例编译、workspace all-features Clippy、格式检查及拒绝 warning 的文档构建全部通过。 - GitHub CI:commit `d7bf36f7e84a5086d8b869451507c1b1b5a9cf27` 的 11 项检查全部通过,见 [run 34815229794](https://github.com/Kilerd/gotcha/actions/runs/34815229794)。
Activity