Упражнение. Добавление устойчивого таймера для управления длительной задачей
Компания просит вас дополнить новый рабочий процесс этапом эскалации, который выполняет указанное действие при отсутствии своевременного утверждения для предложения по разработке проекта.
В этом упражнении вы добавите таймер для контроля времени ожидания при выполнении рабочего процесса. Также вы узнаете, как использовать время ожидания для выбора пути выполнения рабочего процесса.
Добавление пакета npm moment в приложение-функцию
Прежде чем изменять рабочий процесс, следует добавить в приложение-функцию пакет npm moment через консоль.
Войдите на портал Azure, используя ту же учетную запись, с помощью которой вы активировали песочницу.
В меню портала Azure или на домашней странице в разделе Службы Azure выберите Все ресурсы, а затем выберите приложение-функцию, созданную в предыдущем упражнении. Откроется панель Приложение-функция.
В меню слева в разделе Средства разработки выберите Консоль. Появится панель Консоль вашего приложения-функции.
Убедитесь, что окно консоли открыто в папке C:\home\site\wwwroot, а затем выполните следующие команды, чтобы установить библиотеки, необходимые для этого примера приложения-функции.
Выполните следующую команду, чтобы установить библиотеку TypeScript , которая является обязательной зависимостью для статического ввода.
npm install typescript
Выполните следующую команду, чтобы установить библиотеку moment.js, содержащую функции для работы с датами и временем, которые можно использовать с устойчивыми функциями.
npm install moment
Эти команды могут занять несколько секунд, и диспетчер пакетов узла может отобразить некоторые предупреждения, которые можно игнорировать.
Дождитесь, пока завершится установка всех пакетов, затем закройте окно консоли.
Добавление действия эскалации в приложение-функцию
В меню портала Azure или на домашней странице в разделе Службы Azure выберите Все ресурсы, а затем выберите приложение-функцию. Откроется панель Приложение-функция.
Выберите вкладку "Функции" в центре экрана.
В строке меню "Функции" выберите "Создать". Откроется панель Создание функции.
В разделе "Выбор шаблона" в поле "Фильтр" введите Устойчивые функции действие и выберите этот шаблон из списка. Этот шаблон создает устойчивую функцию, которая выполняется, когда действие вызывается функцией оркестрации.
В разделе Сведения о шаблоне в поле Новая функция введите Эскалация в качестве имени функции, а затем щелкните Создать. Откроется панель эскалации для функции.
В меню навигации слева в разделе Разработчик выберите Код и тестирование. Для функции отобразится панель Код и тестирование.
Код для файла index.js отобразится в редакторе.
Замените существующий код следующим кодом:
module.exports = async function (context) { return `ESCALATION : You have not approved the project design proposal - reassigning to your Manager! ${context.bindings.name}!`; };
Этот код возвращает сообщение о том, что рабочий процесс передан на эскалацию. В рабочей системе эта функция содержит логику напоминания соответствующему получателю или переназначения задачи.
В верхней строке меню выберите Сохранить, чтобы сохранить новую функцию.
Обновление функции оркестрации для использования функции эскалации
В меню портала Azure или на домашней странице в разделе Службы Azure выберите Все ресурсы, а затем выберите приложение-функцию. Откроется панель Приложение-функция.
Выберите вкладку "Функции" в центре экрана.
Выберите функцию OrchFunction, которую вы создали в рамках предыдущего упражнения. Появится панель функции OrchFunction.
В меню навигации слева в разделе Разработчик выберите Код и тестирование. Для функции отобразится панель Код и тестирование.
Код для файла index.js отобразится в редакторе.
Добавьте указанную ниже ссылку в библиотеку снимков.
const moment = require("moment");
Замените текст функции следующим кодом, который проверяет, прошел ли крайний срок для утверждения.
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, добавляя ожидание внешних входных данных. Таким образом, мы можем контролировать, когда ответ возвращается в целях тестирования.
В верхней строке меню выберите Сохранить.
Проверка запуска рабочего процесса Устойчивых функций
В меню портала Azure или на домашней странице в разделе Службы Azure выберите Все ресурсы, а затем выберите приложение-функцию. Откроется панель Приложение-функция.
На панели Обзор в верхней строке меню выберите Перезапустить, а затем при появлении запроса на перезапуск щелкните Да. Дождитесь завершения перезапуска, прежде чем продолжать работу. Откроется панель Приложение-функция.
Выберите вкладку "Функции" в центре экрана.
Выберите функцию HttpStart. Появится панель HttpStart.
В верхней строке меню выберите Получить URL-адрес функции и скопируйте URL-адрес. URL-адрес должен иметь примерно следующий вид:
https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
Используйте этот URL-адрес для запуска функций.
В новом окне браузера откройте скопированный 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/..." }
Скопируйте значение 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" }
Подождите 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" }