Изменение времени сна Uber Cadence на основе внешнего (например, пользовательского) ввода

Есть ли пример рабочего процесса Cadence, изменяющего продолжительность сна на основе внешнего ввода?

Сценарий, который я ищу, таков: рабочий процесс переходит в спящий режим до времени X, но после начала сна, но до его завершения, есть внешний триггер, который заставляет время X измениться на время Y. Y может быть либо позже, либо раньше. чем X. Это может быть даже раньше, чем «сейчас», что должно немедленно освободить сон.

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
648
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот фрагмент кода для того, что вы ищете

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.AddReceive и почему нам нужно использовать selector.Select ближе к концу, но все еще внутри цикла for. У меня ТАКОЙ вопрос, который ссылается на этот пост здесь. Также меня смущает selector.AddReceive, потому что я смотрю на пример таймера из cadence-samplesздесь, и они используют несколько selector.Select и нет selector.AddReceive

samplecode3300 17.03.2021 02:58

Я также использую сигналы, и когда я отправляю сигнал ПРИНЯТЬ, я запускаю таймер, как показано ниже. Следуя этому, я использую ```, если сигнал == ПРИНЯТЬ, selector.AddFuture(timerFuture, func( f workflow.Future) { logger.Info("TIMER FIRED") timerFired = true }) if signal == CANCEL, cancelTimerHandler() ``` timerFired немедленно устанавливается в значение true.

samplecode3300 17.03.2021 05:21

Другие вопросы по теме