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

Concluído

A empresa pediu-lhe que corrigisse o seu novo fluxo de trabalho para incorporar um passo de escalamento de forma a tomar medidas caso uma proposta de design de projetos não seja aprovada atempadamente.

Neste exercício, irá adicionar um temporizador para controlar o tempo limite durante a execução do seu fluxo de trabalho. Também irá saber como utilizar o tempo limite para controlar qual o caminho de execução que o fluxo de trabalho irá utilizar.

Adicionar o pacote npm moment à aplicação de funções

Antes de alterar o nosso fluxo de trabalho, iremos adicionar o pacote npm moment à nossa aplicação de funções através da consola.

  1. Inicie sessão no portal do Azure com a mesma conta que utilizou para ativar o sandbox.

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

  3. Na barra de menus à esquerda, em Ferramentas de Desenvolvimento, selecione Console. O painel Console é exibido para seu aplicativo de função.

  4. Verifique se a janela do console é aberta na pasta C:\home\site\wwwroot e execute os seguintes comandos para instalar as bibliotecas necessárias para este aplicativo de função de exemplo.

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

      npm install typescript
      
    2. Execute o seguinte comando para instalar a biblioteca de momentos , que contém funções de data/hora que você pode usar com funções duráveis.

      npm install moment
      

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

  5. Aguarde até que todos os pacotes sejam instalados e, em seguida, feche a janela da consola.

Adicionar uma atividade de escalamento à aplicação 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, em seguida, selecione seu aplicativo de função. O painel Aplicativo de função é exibido.

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

  3. Na barra de menus da guia Funções , selecione Criar. O painel de funções Criar é exibido.

  4. Em Selecione um modelo, na caixa Filtro, insira a atividade Funções duráveis e selecione esse modelo na lista. Este modelo cria uma função durável que é executada quando uma atividade é chamada por uma função orquestradora.

  5. Em Detalhes do modelo, para o campo Nova Função, insira Escalonamento para o nome da função e selecione Criar. O painel de escalonamento é 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 do arquivo index.js aparece no editor.

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

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

    Este código devolve uma mensagem a indicar que o fluxo de trabalho foi escalado. Num sistema de produção, esta função iria conter a lógica para lembrar o remetente ou reatribuir a tarefa.

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

Atualizar a função de orquestração para utilizar a função de escalamento

  1. No menu do portal do Azure ou na página inicial, em Serviços do Azure, selecione Todos os recursos e, em seguida, selecione seu aplicativo de função. O painel Aplicativo de função é 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 de 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 do arquivo index.js aparece no editor.

  5. Adicione a seguinte referência à biblioteca de momentos .

    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 resumir os conteúdos para os fins deste exercício, se a função Aprovação não responder dentro de 20 segundos, a função Escalamento será chamada. O código também altera a chamada para Approval para aguardar uma entrada externa. Desta forma, podemos controlar quando a resposta volta para fins de teste.

  7. Na barra de menu superior, selecione Guardar.

Verificar se o fluxo de trabalho da 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, em seguida, selecione seu aplicativo de função. O painel Aplicativo de função é exibido.

  2. No painel Visão geral, na barra de menus superior, selecione Reiniciar e, em seguida, selecione Sim quando solicitado a reiniciar. Aguarde pela conclusão do reinício antes de continuar. O painel Aplicativo de função reaparece.

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

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

  5. Na barra de menu superior, selecione Obter URL da função e copie o URL. O seu URL deve assemelhar-se ao seguinte exemplo:

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

    Utilizará este URL para executar as suas funções.

  6. Abra uma nova janela do navegador e navegue até o URL copiado. No URL, substitua o marcador de posição {functionName} por OrchFunction, o que deve assemelhar-se ao seguinte exemplo:

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

    A mensagem de resposta contém um conjunto de pontos finais URI que pode utilizar para monitorizar e gerir a execução, e que pode assemelhar-se 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 navegar até essa URL. Você verá uma mensagem de resposta que mostra o status como Em execução enquanto aguarda a contagem regressiva do temporizador para 20 segundos, o que deve ser semelhante ao 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 terá sido atingido e o fluxo de trabalho chamará a atividade Escalar . Verá uma resposta que deve assemelhar-se ao seguinte exemplo:

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