Завершение TimerTask не требует Task.any для получения завершенного задания - PullRequest
1 голос
/ 19 января 2020

Недавно я начал изучать Azure безсерверные вычисления.

При исследовании долговременных функций я сталкиваюсь с проблемой с временными заданиями.

Вот несколько примеров, объясняющих проблему:

1) фрагмент кода из пути обучения

module.exports = df.orchestrator(function* (context) {
    const outputs = [];
    const deadline = moment.utc(context.df.currentUtcDateTime).add(20, "s");
    const activityTask = context.df.waitForExternalEvent("Approval");
    const timeoutTask = context.df.createTimer(deadline.toDate());

    const winner = yield context.df.Task.any([activityTask, timeoutTask]);
    if (winner === activityTask) {
        outputs.push(yield context.df.callActivity("Approval", "Approved"));
    }
    else
    {
        outputs.push(yield context.df.callActivity("Escalation", "Head of department"));
    }

    if (!timeoutTask.isCompleted) {
        // All pending timers must be complete or canceled before the function exits.
        timeoutTask.cancel();
    }

    return outputs;
});

2) фрагмент кода из документов

const df = require("durable-functions");

module.exports = df.orchestrator(function*(context) {
    const event1 = context.df.waitForExternalEvent("Event1");
    const event2 = context.df.waitForExternalEvent("Event2");
    const event3 = context.df.waitForExternalEvent("Event3");

    const winner = yield context.df.Task.any([event1, event2, event3]);
    if (winner === event1) {
        // ...
    } else if (winner === event2) {
        // ...
    } else if (winner === event3) {
        // ...
    }
});

Что касается второго Например, ситуация предельно ясна:

  1. мы делаем HTTP-вызов к конечной точке, в которой находится уволенный оркестратор, функция генератора
  2. оркестратора собирает 3 различных объекта Task, каждый из которых ожидает внешнего вызова API POST (либо с Event1 , Event2 или Event3 payload),
  3. we yield ing * Вывод 1032 *, который является первым из любой выполненной задачи в данном массиве задач - как только мы отправляем любое из этих 3 событий, мы получаем победителя и код продолжается.

По крайней мере это как я понимаю Мы начинаем с 3 ожидающих задач и taskSet также ожидающих: информация отладчика . Как только какое-либо из этих событий возникает, некоторые задачи изменяют свое состояние на завершенное, taskSet меняют свое состояние на завершенное, возвращается результат.

Теперь давайте просто заменим эти задачи на задачу, основанную на тиме, следующим образом:

const df = require("durable-functions");
const moment = require("moment");

module.exports = df.orchestrator(function*(context) {
    const event1 = context.df.waitForExternalEvent("Event1");
    const event2 = context.df.waitForExternalEvent("Event2");
    // const event3 = context.df.waitForExternalEvent("Event3");
    const deadline = moment.utc(context.df.currentUtcDateTime).add(10, "s");
    const event3 = context.df.createTimer(deadline.toDate());

    const taskSet = context.df.Task.any([event1, event2, event3]);
    const winner = yield taskSet;
    if (winner === event1) {
        // ...
    } else if (winner === event2) {
        // ...
    } else if (winner === event3) {
        // ...
        timeoutTask.cancel();
    }
});

Теперь идея также проста: либо мы не смогли передать Event1 или Event2 и время ожидания увеличилось ( Event3 ), либо мы сделали. Но проблема в том, что даже если Event3 завершится через 10 секунд, мы не сможем присвоить результат - он не определен: информация отладчика . Хотя мы МОЖЕМ уступить (через 10 секунд отладчик начинает с go через все функции поиска еще больше, так что yield был запущен, но попытка пошагово пройти через его назначение вызывает отладчик, чтобы дождаться завершения другой задачи). Кажется, что timeTask завершается, но Task.any не заметил этого.

У кого-нибудь есть предложения, почему это не работает? Пример в (1) должен работать как следует из документации, но это не так (из-за одной и той же проблемы - тайм-аут никогда не срабатывает).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...