Как правильно прервать длительную деятельность Uber Cadence?

Если у меня есть длительная деятельность, которая делает что-то вроде

func Activity(ctx context.Context) error {
    ticker := time.NewTicker(5 * time.Second)
    for {
        select {
        case <-ctx.Done():
            return ctx.Err()
        case <-ticker.C:
            if isServiceReady(ctx) {
                break
            }
        }
    }
    return nil
}

и я хотел бы иметь возможность отменить это из рабочего процесса (без отмены всего рабочего процесса), как бы я тогда это сделал?

Я надеялся, что вы можете получить по каналу контекста Done и затем создать отменяемый контекст в рабочем процессе, но это, очевидно, ничего не делает.

1 ответ

Решение

В настоящее время, чтобы быть отменяемым, деятельность должна пульсировать. Служба Cadence обеспечивает возврат статуса отмены в возвращаемое значение контрольного сигнала активности. Таким образом, если вы начинаете сердцебиение на каждом тике, а интервал сердцебиения достаточно мал (так как клиент не выполняет вызов службы при каждом вызове метода пульса), тогда ваш код должен начать работать.

В будущем мы планируем добавить понятие сеанса со списком задач для конкретного работника для доставки отмен. После того, как это добавлено, отмена не будет полагаться на сердцебиение, которое будет доставлено.

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