Sterowanie długotrwałymi zadaniami przy użyciu czasomierzy
Podczas pracy z długotrwałym przepływem pracy należy wziąć pod uwagę niektóre dodatkowe scenariusze. Na przykład co ma się zdarzyć, jeśli zadanie nie zostanie ukończone przed upływem akceptowalnego czasu? Jak można sprawdzić stan zadania? Te problemy można rozwiązać za pomocą przekroczeń limitu czasu i ścieżek eskalacji.
W przykładowym scenariuszu poproszono Cię o poprawienie nowego przepływu pracy w celu dodania etapu eskalacji, którego zadaniem jest podjęcie działania, gdy propozycja architektury projektu nie została zatwierdzona w odpowiednim czasie.
W tej lekcji dowiesz się, jak kontrolować długotrwałe zadania przy użyciu trwałych czasomierzy oraz jak dodać ścieżkę eskalacji na podstawie czasomierza.
Czasomierze w rozszerzeniu Durable Functions
Rozszerzenie Durable Functions zapewnia czasomierze do użycia w funkcjach orkiestratora, których można użyć do implementowania opóźnień lub konfigurowania limitów czasu dla akcji asynchronicznych. W funkcjach orkiestratora należy używać trwałych czasomierzy zamiast funkcji setTimeout() i setInterval().
Czasomierz trwały można utworzyć, wywołując metodę createTimer() obiektu DurableOrchestrationContext. Ta metoda zwraca zadanie, które jest wznawiane o określonej dacie i godzinie.
Używanie czasomierzy na potrzeby opóźnień
Poniższy przykład ilustruje sposób używania trwałych czasomierzy na potrzeby opóźnień, które wysyłają przypomnienie codziennie przez 10 dni.
const df = require("durable-functions");
const moment = require("moment");
module.exports = df.orchestrator(function*(context) {
for (let i = 0; i < 10; i++) {
const deadline = moment.utc(context.df.currentUtcDateTime).add(i, 'd');
yield context.df.createTimer(deadline.toDate());
yield context.df.callActivity("SendReminder");
}
});
Aby uzyskać bieżącą datę i godzinę, należy zawsze używać funkcji currentUtcDateTime zamiast Date.now lub Date.UTC.
Używanie czasomierzy na potrzeby limitu czasu
Poniższy przykład ilustruje sposób użycia trwałych czasomierzy dla limitu czasu w celu wykonywania innej ścieżki, jeśli upłynie limit czasu. W tym przykładzie funkcja czeka na ukończenie funkcji działania GetQuote lub wygaśnięcie czasomierza deadline. Jeśli funkcja działania ukończy się, zostanie zrealizowany kod przypadku powodzenia, a w przeciwnym razie przypadku przekroczenia limitu czasu.
const df = require("durable-functions");
const moment = require("moment");
module.exports = df.orchestrator(function*(context) {
const deadline = moment.utc(context.df.currentUtcDateTime).add(30, "s");
const activityTask = context.df.callActivity("GetQuote");
const timeoutTask = context.df.createTimer(deadline.toDate());
const winner = yield context.df.Task.any([activityTask, timeoutTask]);
if (winner === activityTask) {
// success case
timeoutTask.cancel();
return true;
}
else
{
// timeout case
return false;
}
});
W następnym ćwiczeniu użyjesz tych informacji, aby dodać ścieżkę eskalacji do naszego przykładowego scenariusza w funkcji orkiestratora.