Как правильно прервать длительную деятельность 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 обеспечивает возврат статуса отмены в возвращаемое значение контрольного сигнала активности. Таким образом, если вы начинаете сердцебиение на каждом тике, а интервал сердцебиения достаточно мал (так как клиент не выполняет вызов службы при каждом вызове метода пульса), тогда ваш код должен начать работать.
В будущем мы планируем добавить понятие сеанса со списком задач для конкретного работника для доставки отмен. После того, как это добавлено, отмена не будет полагаться на сердцебиение, которое будет доставлено.