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
相关产品推荐
相关产品推荐

