ambleloft

让消息触发业务操作

消息不止通知:用户可以在宿主确认后执行操作,再由业务服务回报真实结果。

实践指南

完成后:把消息动作接到 Operation,并报告执行结果。

前置条件:按本页具体步骤准备所需文件与工具;学习路线中的上一页不自动构成依赖。

本页内容

01先运行完整案例

message-actions 包含独立本机业务服务、消息发布、执行记录与查询恢复。先按 README 启动 action-service,再配置地址;不要把服务接受任务误报为任务完成。

打开完整可运行案例

02声明并绑定 Operation

最多两个 actions。commandId 必须是同扩展、exposeTo 包含 page 的 operation ID,不是 contributes.commands 的 openHome 命令。arguments 必须符合该操作 inputSchema;写操作设置 effect: write。

LocalMessageInput · example fragment
actions: [{
  id: 'submit',
  label: 'Submit task',
  commandId: context.extensionId + '.actionRun',
  arguments: { eventKey: 'task:42', mode: 'normal' }
}]

03使用宿主签发的执行记录

处理函数从 invocation.message.invocationId 查找记录,以 record.id 作为远端幂等键。宿主解析真实 action 与参数,执行前复查信任、版本、权限、消息状态与用户确认。

Inside the actionRun backend handler
const id = invocation.message?.invocationId;
if (!id) throw Object.assign(new Error('Message context required'), { code: 'FORBIDDEN' });
const record = (await messages.listActionInvocations()).find(r => r.id === id);
if (!record) throw Object.assign(new Error('Record not found'), { code: 'NOT_FOUND' });

04报告 accepted / completed / unknown

业务端明确接受后报告 accepted,并记录 remoteTaskId;真正完成后再报告 completed。handler 正常返回不会自动标记完成。reportId 标识一次报告,相同 ID 相同内容可幂等重试,但这不允许重放业务写请求。

After the business service confirms acceptance
await messages.reportActionResult({
  invocationId: record.id,
  reportId: 'initial-accepted',
  expectedRevision: record.revision,
  outcome: 'accepted',
  remoteTaskId: remote.id
});

05超时、重启与解决消息

结果未知只查询远端,不自动重新执行。重启后 prepared 记录可成为 notExecuted,dispatching 成为 unknown。completed 不会自动将消息 businessState 改成 resolved;需要 messageUpdate,并提供消息自己的 expectedRevision。消息与执行记录的原子更新任一冲突都会失败。

查阅消息操作 API

检查结果与排错

把消息动作接到 Operation,并报告执行结果。

按本页的验证步骤核对实际结果。涉及业务服务时,分别检查界面提交、工具回执与服务端记录。

打开错误代码与排错 →
SDK / CLI 0.1.0-alpha.9 · 接口基线 兼容性与预览说明 · 案例源码