douxiajia6720 2019-04-25 01:27
浏览 146
已采纳

根据外部(例如使用者)输入变更Uber Cadence睡眠时间

Is there an example of a Cadence workflow changing the sleep duration based on external input?

The scenario I'm looking for is this: the workflow goes into sleep until time X but after the sleep starts but before it completes, there is an external trigger that causes time X to change to time Y. Y can either be later or earlier than X. It can even be earlier than "now", which should release the sleep immediately.

  • 写回答

1条回答 默认 最新

  • duanchifo2866 2019-04-25 01:27
    关注

    Here is code snippet for what you are looking for

    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
    }
    

    Now you can send a signal to reset the timer to 10 seconds like below:

    cadence-cli --domain <domain> wf signal -w <workflow_id>  --name reset --input 10
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上