打断长时间 运行 Uber Cadence activity 的正确方法是什么?

What's the right way to interrupt a long running Uber Cadence activity?

如果我有一个 long-运行 activity 可以做类似

func Activity(ctx context.Context) error {
    ticker := time.NewTicker(5 * time.Second)
    for {
        select {
        case <-ctx.Done():
            return ctx.Err()
        case <-ticker.C:
            if isServiceReady(ctx) {
                break
            }
        }
    }
    return nil
}

并且我希望能够从工作流程中取消它(而不取消整个工作流程),然后我该怎么做?

我曾希望您可以在上下文 Done 通道上接收,然后在工作流中创建一个可取消的上下文,但这显然没有任何作用。

目前要取消 activity 必须心跳。 Cadence 服务在 activity 心跳 return 值上搭载取消状态。因此,如果您在每次滴答时开始心跳并且您的心跳间隔足够小(因为客户端不会在每次心跳方法调用时调用服务)那么您的代码应该开始工作。

将来我们计划添加带有工作人员特定任务列表的会话的概念以交付取消。添加后,取消将不依赖于传递心跳。