【问题标题】:Changing the Uber Cadence Sleep time based on external (e.g. user) input根据外部(例如用户)输入更改 Uber Cadence 睡眠时间
【发布时间】:2020-05-06 23:41:43
【问题描述】:

是否有基于外部输入更改睡眠持续时间的 Cadence 工作流程示例?

我正在寻找的场景是这样的:工作流进入睡眠状态直到时间 X,但在睡眠开始之后但完成之前,有一个外部触发器导致时间 X 更改为时间 Y。Y 可以是晚于或早于 X。它甚至可以早于“现在”,它应该立即释放睡眠。

【问题讨论】:

    标签: go cadence-workflow temporal-workflow


    【解决方案1】:

    这是您要查找的代码 sn-p

    func SampleTimerWorkflow(ctx workflow.Context, timerDelay time.Duration) error 
    {
        logger := workflow.GetLogger(ctx)
        resetCh := workflow.GetSignalChannel(ctx, "reset")
    
        timerFired := false
        delay := timerDelay
        for ;!timerFired; {
            selector := workflow.NewSelector(ctx)
    
            logger.Sugar().Infof("Setting up a timer to fire after: %v", delay)
            timerCancelCtx, cancelTimerHandler := workflow.WithCancel(ctx)
            timerFuture := workflow.NewTimer(timerCancelCtx, delay)
            selector.AddFuture(timerFuture, func(f workflow.Future) {
                logger.Info("Timer Fired.")
                timerFired = true
            })
    
            selector.AddReceive(resetCh, func(c workflow.Channel, more bool) {
                logger.Info("Reset signal received.")
                logger.Info("Cancel outstanding timer.")
                cancelTimerHandler()
    
                var t int
                c.Receive(ctx, &t)
                logger.Sugar().Infof("Reset delay: %v seconds", t)
                delay = time.Second * time.Duration(t)
            })
    
            logger.Info("Waiting for timer to fire.")
            selector.Select(ctx)
        }
    
        workflow.GetLogger(ctx).Info("Workflow completed.")
        return nil
    }
    

    现在您可以发送信号将计时器重置为 10 秒,如下所示:

    cadence-cli --domain <domain> wf signal -w <workflow_id>  --name reset --input 10
    

    【讨论】:

    • 嘿Maxim,我想知道selector.AddReceive 的用途是什么以及为什么我们需要在接近尾声时使用selector.Select,但仍在for 循环中。我有一个参考这篇文章here 的问题也被selector.AddReceive 弄糊涂了,因为我正在查看cadence-samples here 的计时器示例,他们使用多个selector.Select 而没有selector.AddReceive
    • 我也在使用信号,当我发送一个 ACCEPT 信号时,我会按如下方式启动计时器 跟进这个,我使用 ``` if signal == ACCEPT, selector.AddFuture(timerFuture, func(f workflow.Future) { logger.Info("TIMER FIRED") timerFired = true }) if signal == CANCEL, cancelTimerHandler() ``` timerFired 立即设置为 true。
    猜你喜欢
    • 2020-07-10
    • 2016-11-07
    • 2022-10-17
    • 2017-03-27
    • 1970-01-01
    • 2011-03-14
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多