当前位置: 首页 > 知识库问答 >
问题:

如何将workflow.Context传递给Cadence活动

谭健柏
2023-03-14

我想把<代码>工作流程。睡眠调用我的Cadence活动之一,以便能够正确测试它(并模拟Sleepfunction产生的错误结果)。

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

  • 上下文。上下文工作流。上下文是单独的类型。
  • 每个活动的第一个参数 - 上下文。上下文 - 是可选的,可以省略

我的尝试:

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":"无法解码活动函数输入字节错误:无法解码参数:0,*internal.Context,json错误:json:无法将对象散集到Go函数类型的值internal.Context

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":"反映:输入参数太少的调用"

问题

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

共有1个答案

司徒焕
2023-03-14

是否可以使用工作流。在任何活动中睡觉?

不可以,不允许使用工作流。在活动代码中睡觉。

工作流。睡眠仅允许在工作流代码中使用。一般来说,workflow包中的所有API仅允许在工作流代码中使用。

工作流代码将在决策任务中执行,工作流线程/协程(特殊类型的goroutines)由Cadence管理。这就是< code>workflow包中的API的工作方式。如果没有决策任务和工作流线程/协同程序,这些API将无法正常工作。

另一方面,活动代码只是纯粹的普通代码,您应该使用常规的本地库或依赖项来实现逻辑。例如,您可以使用<代码>时间。活动代码中的睡眠。

 类似资料:
  • 我有三节课 1.菜单活动 2.LocationUpdateService 3.多重标记器 1.菜单活动 2、LocationUpdateService:(这是服务类) 3、多重标记(活动) 我的问题是:当我打开我的菜单活动我的Toast消息打印发送数据到广播接收器,然后点击按钮我调用MultipleMarker。我无法从服务中获取值。。。但当我按下后退按钮时,我重定向到MenuActivity,此

  • 我是uber Cadence的新手,尝试编写一个cron调度任务。Cadence提供了一个cron附表注释(在网上找个例子),它需要一个cron表达式字符串,用于在特定时间触发方法。但是,我想让这个cron表达式按照我们在yml文件中设置的来加载。有什么方法可以做到吗?我目前只找到了这个@cron附表注释的方法来做。我还发现有一个Workflow Option可以设置cron附表。但是,不知道如何

  • 当我关闭一个活动时,我希望它将一个值传递给另一个活动中的一个片段,我该怎么做? 活动B 片段A 代码不起作用,因为它给了我一个错误 谢啦

  • 我只是在尝试一些基本的Uber Cadence示例。我遇到了如下问题:我有一个接收结构作为参数并更改值并返回修改后的结构的活动。当执行workflow.It显示默认values.Code片段时,我无法获得修改后的值,我尝试了如下: