Exercício – Adicionar um temporizador durável para gerenciar uma tarefa de execução prolongada

Concluído

A empresa solicitou que você corrigisse seu novo fluxo de trabalho a fim de incorporar uma etapa de escalonamento para executar uma ação caso uma proposta de design de projeto não seja aprovada em tempo hábil.

Neste exercício, você adicionará um temporizador para controlar o tempo limite durante a execução do fluxo de trabalho. Você também aprenderá a usar o tempo limite para controlar qual caminho de execução será usado pelo fluxo de trabalho.

Adicionar o pacote npm moment ao aplicativo de funções

Antes de alterarmos nosso fluxo de trabalho, adicionaremos o pacote npm moment ao aplicativo de funções por meio do console.

  1. Entre no portal do Azure usando a conta que você utilizou para ativar a área restrita.

  2. No menu do portal do Azure ou na página Inicial, em Serviços do Azure, selecione Todos os recursos e selecione o aplicativo de funções que você criou no exercício anterior. O painel Aplicativo de Funções é exibido.

  3. Na barra do menu à esquerda, em Ferramentas de Desenvolvimento, selecione Console. O painel Console é exibido para o seu aplicativo de funções.

  4. Verifique se a pasta C:\home\site\wwwroot exibe a janela do console e execute os comandos a seguir para instalar as bibliotecas necessárias para este exemplo de aplicativo de funções.

    1. Execute o comando a seguir para instalar a biblioteca TypeScript, que é uma dependência necessária para a digitação estática.

      npm install typescript
      
    2. Execute o comando a seguir para instalar a biblioteca moment, que contém funções de data/hora que podem ser usadas com as Durable Functions.

      npm install moment
      

      Esses comandos podem levar alguns segundos para serem concluídos e o gerenciador de pacotes de nós poderá mostrar alguns avisos, que você pode ignorar.

  5. Aguarde a instalação de todos os pacotes e feche a janela do console.

Adicionar uma atividade de escalonamento ao aplicativo de funções

  1. No menu do portal do Azure ou na página Inicial, em Serviços do Azure, selecione Todos os recursos e selecione seu aplicativo de funções. O painel Aplicativo de Funções é exibido.

  2. Selecione a guia Funções no centro da tela.

  3. Na barra de menus da guia Functions, selecione Criar. O painel Criar função é exibido.

  4. Na guia Selecionar um modelo, na caixa Filtro, digite Atividade do Durable Functions e selecione esse modelo na lista. Esse modelo cria uma função durável que é executada quando uma atividade é chamada por uma função de orquestrador.

  5. Em Detalhes do modelo, para o campo Nova Função, insira Escalonamento para o nome da função e selecione Criar. O painel escalonamento será exibido para sua função.

  6. No painel de menu esquerdo, em Desenvolvedor, selecione Código + Teste. O painel Código + Teste é exibido para sua função.

    O código para o arquivo index.js é exibido no editor.

  7. Substitua o código existente pelo seguinte código:

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

    Esse código retorna uma mensagem que indica que o fluxo de trabalho foi escalonado. Em um sistema de produção, essa função conteria a lógica para lembrar o destinatário ou reatribuir a tarefa.

  8. Na barra de menus superior, selecione Salvar para salvar sua nova função.

Atualizar a função de orquestração para usar a função Escalonamento

  1. No menu do portal do Azure ou na página Inicial, em Serviços do Azure, selecione Todos os recursos e selecione seu aplicativo de funções. O painel Aplicativo de Funções é exibido.

  2. Selecione a guia Funções no centro da tela.

  3. Selecione a função OrchFunction que você criou no exercício anterior. O painel da função OrchFunction é exibido.

  4. No painel de menu esquerdo, em Desenvolvedor, selecione Código + Teste. O painel Código + Teste é exibido para sua função.

    O código para o arquivo index.js é exibido no editor.

  5. Adicione a referência a seguir à biblioteca momento.

    const moment = require("moment");
    
  6. Substitua o corpo da função pelo código a seguir, que testará se o prazo para aprovação já passou.

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

    Para este exercício não ficar muito longo, se a função Aprovação não responder em até 20 segundos, a função Escalonamento será chamada. O código também altera a chamada para Aprovação para aguardar uma entrada externa. Assim, podemos controlar quando a resposta retorna para fins de testes.

  7. Na barra de menus superior, selecione Salvar.

Verificar se o fluxo de trabalho das Durable Functions é iniciado

  1. No menu do portal do Azure ou na página Inicial, em Serviços do Azure, selecione Todos os recursos e selecione seu aplicativo de funções. O painel Aplicativo de Funções é exibido.

  2. No painel Visão Geral, na barra de menus superior, selecione Reiniciar e selecione Sim quando solicitado a reiniciar. Aguarde a reinicialização ser concluída antes de continuar. Seu painel do Aplicativo de Funções é exibido novamente.

  3. Selecione a guia Funções no centro da tela.

  4. Selecione sua função HttpStart. O painel HttpStart é exibido.

  5. Na barra de menus superior, selecione Obter URL da Função e copie a URL. A URL deverá ser parecida com o seguinte exemplo:

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

    Você usará essa URL para executar suas funções.

  6. Abra uma nova janela do navegador e navegue até a URL que você copiou. Na URL, substitua o espaço reservado {functionName} por OrchFunction, que deve ser semelhante ao seguinte exemplo:

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

    A mensagem de resposta contém um conjunto de pontos de extremidade de URI que você pode usar para monitorar e gerenciar a execução, que deverá ser semelhante ao seguinte exemplo:

    {
      "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. Copie o valor statusQueryGetUri e use seu navegador da web para acessar essa URL. Você deverá ver uma mensagem de resposta mostrando que a instância está Em Execução, enquanto aguarda o temporizador terminar a contagem regressiva de 20 segundos, que deve se parecer com o exemplo a seguir:

    {
      "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. Aguarde 20 segundos e atualize a janela do navegador. O tempo limite será atingido e o fluxo de trabalho chamará a atividade de Escalonamento. Você verá uma resposta que deve ter uma aparência semelhante à seguinte:

    {
        "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"
    }