让消息触发业务操作
消息不止通知:用户可以在宿主确认后执行操作,再由业务服务回报真实结果。
完成后:把消息动作接到 Operation,并报告执行结果。
前置条件:按本页具体步骤准备所需文件与工具;学习路线中的上一页不自动构成依赖。
本页内容
01先运行完整案例
message-actions 包含独立本机业务服务、消息发布、执行记录与查询恢复。先按 README 启动 action-service,再配置地址;不要把服务接受任务误报为任务完成。
打开完整可运行案例02声明并绑定 Operation
最多两个 actions。commandId 必须是同扩展、exposeTo 包含 page 的 operation ID,不是 contributes.commands 的 openHome 命令。arguments 必须符合该操作 inputSchema;写操作设置 effect: write。
actions: [{
id: 'submit',
label: 'Submit task',
commandId: context.extensionId + '.actionRun',
arguments: { eventKey: 'task:42', mode: 'normal' }
}]03使用宿主签发的执行记录
处理函数从 invocation.message.invocationId 查找记录,以 record.id 作为远端幂等键。宿主解析真实 action 与参数,执行前复查信任、版本、权限、消息状态与用户确认。
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 相同内容可幂等重试,但这不允许重放业务写请求。
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,并报告执行结果。
按本页的验证步骤核对实际结果。涉及业务服务时,分别检查界面提交、工具回执与服务端记录。
打开错误代码与排错 →