Упражнение. Добавление устойчивого таймера для управления длительной задачей

Завершено

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

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

Добавление пакета npm moment в приложение-функцию

Прежде чем изменять рабочий процесс, следует добавить в приложение-функцию пакет npm moment через консоль.

  1. Войдите на портал Azure, используя ту же учетную запись, с помощью которой вы активировали песочницу.

  2. В меню портала Azure или на домашней странице в разделе Службы Azure выберите Все ресурсы, а затем выберите приложение-функцию, созданную в предыдущем упражнении. Откроется панель Приложение-функция.

  3. В меню слева в разделе Средства разработки выберите Консоль. Появится панель Консоль вашего приложения-функции.

  4. Убедитесь, что окно консоли открыто в папке C:\home\site\wwwroot, а затем выполните следующие команды, чтобы установить библиотеки, необходимые для этого примера приложения-функции.

    1. Выполните следующую команду, чтобы установить библиотеку TypeScript , которая является обязательной зависимостью для статического ввода.

      npm install typescript
      
    2. Выполните следующую команду, чтобы установить библиотеку moment.js, содержащую функции для работы с датами и временем, которые можно использовать с устойчивыми функциями.

      npm install moment
      

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

  5. Дождитесь, пока завершится установка всех пакетов, затем закройте окно консоли.

Добавление действия эскалации в приложение-функцию

  1. В меню портала Azure или на домашней странице в разделе Службы Azure выберите Все ресурсы, а затем выберите приложение-функцию. Откроется панель Приложение-функция.

  2. Выберите вкладку "Функции" в центре экрана.

  3. В строке меню "Функции" выберите "Создать". Откроется панель Создание функции.

  4. В разделе "Выбор шаблона" в поле "Фильтр" введите Устойчивые функции действие и выберите этот шаблон из списка. Этот шаблон создает устойчивую функцию, которая выполняется, когда действие вызывается функцией оркестрации.

  5. В разделе Сведения о шаблоне в поле Новая функция введите Эскалация в качестве имени функции, а затем щелкните Создать. Откроется панель эскалации для функции.

  6. В меню навигации слева в разделе Разработчик выберите Код и тестирование. Для функции отобразится панель Код и тестирование.

    Код для файла index.js отобразится в редакторе.

  7. Замените существующий код следующим кодом:

    module.exports = async function (context) {
        return `ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  ${context.bindings.name}!`;
    };
    

    Этот код возвращает сообщение о том, что рабочий процесс передан на эскалацию. В рабочей системе эта функция содержит логику напоминания соответствующему получателю или переназначения задачи.

  8. В верхней строке меню выберите Сохранить, чтобы сохранить новую функцию.

Обновление функции оркестрации для использования функции эскалации

  1. В меню портала Azure или на домашней странице в разделе Службы Azure выберите Все ресурсы, а затем выберите приложение-функцию. Откроется панель Приложение-функция.

  2. Выберите вкладку "Функции" в центре экрана.

  3. Выберите функцию OrchFunction, которую вы создали в рамках предыдущего упражнения. Появится панель функции OrchFunction.

  4. В меню навигации слева в разделе Разработчик выберите Код и тестирование. Для функции отобразится панель Код и тестирование.

    Код для файла index.js отобразится в редакторе.

  5. Добавьте указанную ниже ссылку в библиотеку снимков.

    const moment = require("moment");
    
  6. Замените текст функции следующим кодом, который проверяет, прошел ли крайний срок для утверждения.

    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;
    });
    

    Чтобы не усложнять наш пример, функция Escalation вызывается, если функция Approval не отвечает в течение 20 секунд. Также этот код изменяет вызов Approval, добавляя ожидание внешних входных данных. Таким образом, мы можем контролировать, когда ответ возвращается в целях тестирования.

  7. В верхней строке меню выберите Сохранить.

Проверка запуска рабочего процесса Устойчивых функций

  1. В меню портала Azure или на домашней странице в разделе Службы Azure выберите Все ресурсы, а затем выберите приложение-функцию. Откроется панель Приложение-функция.

  2. На панели Обзор в верхней строке меню выберите Перезапустить, а затем при появлении запроса на перезапуск щелкните Да. Дождитесь завершения перезапуска, прежде чем продолжать работу. Откроется панель Приложение-функция.

  3. Выберите вкладку "Функции" в центре экрана.

  4. Выберите функцию HttpStart. Появится панель HttpStart.

  5. В верхней строке меню выберите Получить URL-адрес функции и скопируйте URL-адрес. URL-адрес должен иметь примерно следующий вид:

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Используйте этот URL-адрес для запуска функций.

  6. В новом окне браузера откройте скопированный URL-адрес. В URL-адресе замените заполнитель {functionName} на OrchFunction, который должен выглядеть следующим образом:

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Ответное сообщение содержит набор конечных точек URI, с помощью которых можно отслеживать и контролировать выполнение. Это выглядит следующим образом:

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  7. Скопируйте значение statusQueryGetUri и используйте веб-браузер для перехода по url-адресу. Должно появиться ответное сообщение, показывающее состояние выполнения во время ожидания таймера отсчитывать до 20 секунд, которое должно выглядеть следующим образом:

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Running",
      "input": null,
      "customStatus": null,
      "output": null,
      "createdTime": "2019-04-14T13:17:26Z",
      "lastUpdatedTime": "2019-04-14T13:17:27Z"
    }
    
  8. Подождите 20 секунд и обновите окно браузера. Время ожидания будет достигнуто, и рабочий процесс вызовет действие эскалации. Вы получите ответ, как в следующем примере:

    {
        "name": "OrchFunction",
        "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "ESCALATION : You have not approved the project design proposal - reassigning to your Manager!  Head of department!"
        ],
        "createdTime": "2019-04-14T13:43:09Z",
        "lastUpdatedTime": "2019-04-14T13:43:31Z"
    }