You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中Temporal工作流Memo写入后读取为空问题排查

问题原因及解决方案

核心原因

upsertMemo在Activity中调用时,仅会修改当前Worker内存里的Workflow视图数据,不会将变更持久化到Temporal Server存储的Workflow执行元数据中。只有在Workflow代码上下文中调用upsertMemo,才会触发元数据的持久化更新,这样listWorkflowExecutions才能查询到更新后的Memo。

可行解决方案

方案一:Workflow上下文内更新Memo

不要在Activity中直接调用upsertMemo,改为让Activity返回需要更新的Memo字段值,再由Workflow执行upsertMemo操作:

Workflow代码:

async function workflowName() {
  // 调用Activity获取Memo字段值
  const fieldValue = await activities.getFieldValue();
  // 在Workflow上下文执行upsertMemo,触发持久化
  upsertMemo({'fieldName': fieldValue});
  console.log(`Memo set to ${JSON.stringify(workflowInfo().memo)}`);
}

Activity代码:

async function getFieldValue() {
  return "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
}

方案二:通过Signal触发Workflow更新Memo

如果必须在Activity中触发Memo更新,可以发送Signal给Workflow,由Workflow在自身上下文执行upsertMemo:

定义Signal:

const updateMemoSignal = defineSignal('updateMemo', {
  args: [{ name: 'memo', type: object }]
});

Workflow中处理Signal:

async function workflowName() {
  setHandler(updateMemoSignal, (newMemo) => {
    upsertMemo(newMemo);
  });
  // 执行其他Workflow逻辑
}

Activity中发送Signal:

async function someActivity() {
  const fieldValue = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  const info = workflowInfo();
  const client = await getClient();
  // 发送Signal到当前Workflow
  await client.workflow.signal(info.workflowId, info.runId, updateMemoSignal, {'fieldName': fieldValue});
}

验证

修改完成后,重新执行Workflow,再调用listWorkflowExecutions查询,即可在WorkflowExecutionInfo.memo中获取到预期的{"fieldName":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}数据。

内容的提问来源于stack exchange,提问作者Mauro Vanetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:24:56