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 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分