Exercício – adicionar um temporizador durável para gerir uma tarefa de execução prolongada
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.
Inicie sessão no portal do Azure com a mesma conta que utilizou para ativar o sandbox.
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.
Na barra de menus à esquerda, em Ferramentas de Desenvolvimento, selecione Console. O painel Console é exibido para seu aplicativo de função.
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.
Execute o seguinte comando para instalar a biblioteca TypeScript , que é uma dependência necessária para a digitação estática.
npm install typescript
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.
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
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.
Selecione a guia Funções no centro da tela.
Na barra de menus da guia Funções , selecione Criar. O painel de funções Criar é exibido.
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.
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.
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.
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.
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
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.
Selecione a guia Funções no centro da tela.
Selecione a função OrchFunction que você criou no exercício anterior. O painel de função OrchFunction é exibido.
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.
Adicione a seguinte referência à biblioteca de momentos .
const moment = require("moment");
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.
Na barra de menu superior, selecione Salvar.
Verificar se o fluxo de trabalho da Durable Functions é iniciado
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.
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.
Selecione a guia Funções no centro da tela.
Selecione sua função HttpStart . O painel HttpStart é exibido.
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.
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/..." }
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" }
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" }