Есть ли пример рабочего процесса Cadence, изменяющего продолжительность сна на основе внешнего ввода?
Сценарий, который я ищу, таков: рабочий процесс переходит в спящий режим до времени X, но после начала сна, но до его завершения, есть внешний триггер, который заставляет время X измениться на время Y. Y может быть либо позже, либо раньше. чем X. Это может быть даже раньше, чем «сейчас», что должно немедленно освободить сон.
Вот фрагмент кода для того, что вы ищете
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
Я также использую сигналы, и когда я отправляю сигнал ПРИНЯТЬ, я запускаю таймер, как показано ниже. Следуя этому, я использую ```, если сигнал == ПРИНЯТЬ, selector.AddFuture(timerFuture, func( f workflow.Future) { logger.Info("TIMER FIRED") timerFired = true }) if signal == CANCEL, cancelTimerHandler() ``` timerFired немедленно устанавливается в значение true.
Привет, Максим, мне интересно, какова цель
selector.AddReceive
и почему нам нужно использоватьselector.Select
ближе к концу, но все еще внутри цикла for. У меня ТАКОЙ вопрос, который ссылается на этот пост здесь. Также меня смущаетselector.AddReceive
, потому что я смотрю на пример таймера изcadence-samples
здесь, и они используют несколькоselector.Select
и нетselector.AddReceive