如何将 workflow.Context 传递给 Cadence activity

How to pass workflow.Context to the Cadence activity

我想在我的一项 Cadence 活动中调用 workflow.Sleep 以便能够正确测试它(并模拟来自 Sleep 函数的错误结果)。

我在实施之前注意到的两件重要事情:

我的尝试:

1.先试试

import "go.uber.org/cadence/workflow"

// Activity:    
func (s *MyActivities) WorkflowSleep(_ context.Context, workflowCtx workflow.Context, duration time.Duration) error {
    return workflow.Sleep(workflowCtx, duration)
}

// In workflow; ctx has type workflow.Context:
    err := workflow.ExecuteActivity(ctx, myActivities.WorkflowSleep, ctx, duration).Get(ctx, nil)

错误:

"error":"unable to decode the activity function input bytes with error: unable to decode argument: 0, *internal.Context, with json error: json: cannot unmarshal object into Go value of type internal.Context for function

2。第二次尝试

import "go.uber.org/cadence/workflow"

// Activity:    
func (s *MyActivities) WorkflowSleep(workflowCtx workflow.Context, duration time.Duration) error {
    return workflow.Sleep(workflowCtx, duration)
}

// In workflow; ctx has type workflow.Context:
    err := workflow.ExecuteActivity(ctx, myActivities.WorkflowSleep, duration).Get(ctx, nil)

错误:

"PanicError":"reflect: Call with too few input arguments"

问题

是否可以在任何 activity 中使用 workflow.Sleep

Is it possible to use workflow.Sleep inside any activity?

不,不允许在 activity 代码中使用 workflow.Sleep

Workflow.Sleep 只允许在工作流代码中使用。 更一般地说,workflow 包中的所有 API 只允许在工作流代码中使用。

工作流代码将在决策任务中执行,工作流threads/coroutines(特殊类型的goroutines)由Cadence管理。 workflow 包中的 API 就是这样工作的。没有 decision tasks and workflow threads/coroutines,那些 API 将无法正常工作。

另一方面,activity 代码只是纯粹的普通代码,您应该使用常规本机库或依赖项来实现逻辑。例如,您可以在 activity 代码中使用 time.Sleep