Guia de início rápido: criar um aplicativo Java Durable Functions

Use Durable Functions, uma funcionalidade do Funções do Azure, para escrever funções com estado num ambiente serverless. Durable Functions gere o estado, os pontos de verificação e os reinícios na sua aplicação.

Neste quickstart, cria e testa uma aplicação Durable Functions em Java.

Uma aplicação básica de Durable Functions tem três funções:

  • Função Orquestrator (Cities): Um fluxo de trabalho que orquestra outras funções.
  • Função de atividade (Capitalize): Uma função que o orquestrador chama para realizar trabalho e devolver um valor.
  • Função cliente (StartOrchestration): Uma função ativada por HTTP que inicia o orquestrador.

Este início rápido oferece três caminhos de configuração. Use o seletor no topo da página para escolher a sua abordagem preferida:

  • Configuração manual: Crie cada ficheiro manualmente para controlo total sobre a estrutura do projeto.
  • Comando Maven: Usa um arquétipo Maven para estruturar o projeto num só comando.
  • Visual Studio Code: Use a extensão VS Code Funções do Azure para gerar o projeto através de uma interface guiada.

Pré-requisitos

Para concluir este arranque rápido, necessita de:

  • A versão 8 ou posterior do Java Developer Kit deve estar instalada.

  • Apache Maven versão 3.0 ou posterior instalado.

  • A versão mais recente das Funções do Azure Core Tools.

    Para o Funções do Azure 4.x, é necessário o Core Tools versão 4.0.4915 ou posterior.

  • Uma ferramenta de teste HTTP que mantém seus dados seguros. Para obter mais informações, consulte Ferramentas de teste HTTP.

  • Visual Studio Code com a extensão Funções do Azure instalada (necessária apenas para o caminho de configuração Visual Studio Code).

  • Uma assinatura do Azure. Para usar o Durable Functions, deve ter uma conta no Armazenamento do Azure.

Se não tiver uma conta do Azure, crie uma conta gratuita antes de começar.

Adicione dependências e plug-ins necessários ao seu projeto

Adicione o seguinte código ao seu ficheiropom.xml . Antes de copiar, substitua your-unique-app-name por um nome de aplicação de função globalmente único. Ajusta region, javaVersion, e resourceGroup para corresponder ao teu ambiente.

<properties>
  <azure.functions.maven.plugin.version>1.18.0</azure.functions.maven.plugin.version>
  <azure.functions.java.library.version>3.0.0</azure.functions.java.library.version>
  <durabletask.azure.functions>1.0.0</durabletask.azure.functions>
  <functionAppName>your-unique-app-name</functionAppName>
</properties>

<dependencies>
  <dependency>
    <groupId>com.microsoft.azure.functions</groupId>
    <artifactId>azure-functions-java-library</artifactId>
    <version>${azure.functions.java.library.version}</version>
  </dependency>
  <dependency>
    <groupId>com.microsoft</groupId>
    <artifactId>durabletask-azure-functions</artifactId>
    <version>${durabletask.azure.functions}</version>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.1</version>
    </plugin>
    <plugin>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-functions-maven-plugin</artifactId>
      <version>${azure.functions.maven.plugin.version}</version>
      <configuration>
        <appName>${functionAppName}</appName>
        <resourceGroup>java-functions-group</resourceGroup>
        <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
        <region>westus</region>
        <runtime>
          <os>windows</os>
          <javaVersion>11</javaVersion>
        </runtime>
        <appSettings>
          <property>
            <name>FUNCTIONS_EXTENSION_VERSION</name>
            <value>~4</value>
          </property>
        </appSettings>
      </configuration>
      <executions>
        <execution>
          <id>package-functions</id>
          <goals>
            <goal>package</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-clean-plugin</artifactId>
      <version>3.1.0</version>
    </plugin>
  </plugins>
</build>

Adicione os arquivos JSON necessários

Adicione um arquivo host.json ao diretório do projeto. Deve ser semelhante ao seguinte exemplo:

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "DurableTask.AzureStorage": "Warning",
      "DurableTask.Core": "Warning"
    }
  },
  "extensions": {
    "durableTask": {
      "hubName": "JavaTestHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Observação

Durable Functions para Java requer o pacote de extensões v4. Pacotes anteriores não são suportados. Para mais informações, consulte a documentação dos pacotes de extensão.

O Durable Functions precisa de um provedor de armazenamento para armazenar o estado de tempo de execução. Adicione um arquivo local.settings.json ao diretório do projeto para configurar o provedor de armazenamento. Para usar o Armazenamento do Azure como provedor, defina o valor de AzureWebJobsStorage para a cadeia de conexão da sua conta de Armazenamento do Azure.

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "<your storage account connection string>",
    "FUNCTIONS_WORKER_RUNTIME": "java"
  }
}

Importante

O ficheirolocal.settings.json pode conter segredos. Certifica-te de que o adicionas ao teu ficheiro .gitignore para evitar que seja enviado ao controlo de versão.

Crie o seu orquestrador, trabalho e funções de cliente da Durable Functions

O código de exemplo a seguir mostra um exemplo básico de cada tipo de função:

import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
import java.util.*;

import com.microsoft.durabletask.*;
import com.microsoft.durabletask.azurefunctions.DurableActivityTrigger;
import com.microsoft.durabletask.azurefunctions.DurableClientContext;
import com.microsoft.durabletask.azurefunctions.DurableClientInput;
import com.microsoft.durabletask.azurefunctions.DurableOrchestrationTrigger;

public class DurableFunctionsSample {
    /**
     * This HTTP-triggered function starts the orchestration.
     */
    @FunctionName("StartOrchestration")
    public HttpResponseMessage startOrchestration(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            @DurableClientInput(name = "durableContext") DurableClientContext durableContext,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        DurableTaskClient client = durableContext.getClient();
        String instanceId = client.scheduleNewOrchestrationInstance("Cities");
        context.getLogger().info("Created new Java orchestration with instance ID = " + instanceId);
        return durableContext.createCheckStatusResponse(request, instanceId);
    }

    /**
     * This is the orchestrator function, which can schedule activity functions, create durable timers,
     * or wait for external events in a way that's completely fault-tolerant.
     */
    @FunctionName("Cities")
    public String citiesOrchestrator(
            @DurableOrchestrationTrigger(name = "taskOrchestrationContext") TaskOrchestrationContext ctx) {
        String result = "";
        result += ctx.callActivity("Capitalize", "Tokyo", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "London", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "Seattle", String.class).await() + ", ";
        result += ctx.callActivity("Capitalize", "Austin", String.class).await();
        return result;
    }

    /**
     * This is the activity function that is invoked by the orchestrator function.
     */
    @FunctionName("Capitalize")
    public String capitalize(@DurableActivityTrigger(name = "name") String name, final ExecutionContext context) {
        context.getLogger().info("Capitalizing: " + name);
        return name.toUpperCase();
    }
}

Crie um projeto local de Durable Functions usando o comando Maven

Execute o seguinte comando para gerar um projeto que contém as funções básicas de um aplicativo Durable Functions:

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.62 -Dtrigger=durablefunctions

Nos prompts, forneça as seguintes informações:

Prompt Action
groupId Digite com.function.
artifactId Digite myDurableFunction.
Versão Selecione 1.0-SNAPSHOT.
embalagem Digite com.function.
Y Digite Y e selecione Enter para confirmar.

Agora você tem um projeto local que tem as três funções que estão em um aplicativo básico de Funções Duráveis. O arquétipo inclui com.microsoft:durabletask-azure-functions automaticamente como uma dependência no seu ficheiro pom.xml.

Configure o fornecedor de armazenamento back-end para Durable Functions

O Durable Functions precisa de um provedor de armazenamento para armazenar o estado de tempo de execução. Você pode definir o Armazenamento do Azure como o provedor de armazenamento no local.settings.json. Use a string de conexão da sua conta de armazenamento do Azure como valor para AzureWebJobsStorage como neste exemplo:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "<your storage account connection string>",
    "FUNCTIONS_WORKER_RUNTIME": "java"
  }
}

Importante

O ficheirolocal.settings.json pode conter segredos. Certifica-te de que o adicionas ao teu ficheiro .gitignore para evitar que seja enviado ao controlo de origem.

Criar o seu projeto local

  1. No Visual Studio Code, selecione F1 (ou selecione Ctrl/Cmd+Shift+P) para abrir a paleta de comandos. No prompt (>), entre e depois selecione Funções do Azure: Criar Novo Projeto.

    Captura de ecrã do comando Funções do Azure Criar Novo Projeto na paleta de comandos do Visual Studio Code.

  2. Selecione Procurar. Na caixa de diálogo Selecionar pasta, vá para uma pasta a ser usada para seu projeto e escolha Selecionar.

  3. Nos prompts, forneça as seguintes informações:

    Prompt Action
    Selecione um idioma Selecione Java.
    Seleciona uma versão de Java Selecione Java 8 ou posterior. Selecione a versão do Java em que suas funções são executadas no Azure e uma que você verificou localmente.
    Fornecer um ID de grupo Digite com.function.
    Fornecer um ID de artefato Digite myDurableFunction.
    Fornecer uma versão Digite 1.0-SNAPSHOT.
    Forneça um nome de pacote Digite com.function.
    Fornecer um nome de aplicativo Digite myDurableFunction.
    Seleciona a ferramenta de compilação para Java projeto Selecione Maven.
    Selecione como gostaria de abrir o seu projeto Selecione Abrir em nova janela.

Agora você tem um projeto que tem uma função HTTP de exemplo. Podes remover a função HTTP gerada, porque adicionas as Durable Functions no passo seguinte.

Adicionar funções ao projeto

  1. Na paleta de comandos, enter e depois selecione Funções do Azure: Criar Função.

  2. Em Alterar filtro de modelo, selecione Todos.

  3. Nos prompts, forneça as seguintes informações:

    Prompt Action
    Selecione um modelo para a sua função Selecione DurableFunctionsOrchestration.
    Forneça um nome de pacote Digite com.function.
    Fornecer um nome de função Introduza DurableFunctionsOrchestrator.
  4. Na caixa de diálogo, escolha Selecionar conta de armazenamento para configurar uma conta de armazenamento e siga as instruções.

Agora você deve ter as três funções básicas geradas para um aplicativo Durable Functions.

Configura pom.xml e host.json para Durable Functions

Adicione a seguinte dependência ao seu arquivo pom.xml:

<dependency>
  <groupId>com.microsoft</groupId>
  <artifactId>durabletask-azure-functions</artifactId>
  <version>1.0.0</version>
</dependency>

Adicione a propriedade extensions ao seu ficheiro host.json. Se o ficheiro já tiver outras propriedades, funde o extensions bloco no JSON existente:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "JavaTestHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Testar localmente a função

O Funções do Azure Core Tools dá-lhe a capacidade de executar um projeto Funções do Azure no seu computador local de desenvolvimento.

  1. Se você estiver usando o Visual Studio Code, abra uma nova janela do terminal e execute os seguintes comandos para criar o projeto:

    mvn clean package
    

    Em seguida, execute a função durável:

    mvn azure-functions:run
    
  2. No painel do terminal, copie o URL de endpoint da sua função acionada por HTTP.

    Captura de ecrã da saída do terminal a mostrar a URL do endpoint HTTP para o runtime local do Funções do Azure.

  3. Utilize a sua ferramenta de teste HTTP para enviar um pedido HTTP POST para o endpoint URL.

    A resposta deve ser semelhante ao exemplo a seguir:

    {
        "id": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
        "purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKo...",
        "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/raiseEvent/{eventName}?code=ACCupah_QfGKo...",
        "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9?code=ACCupah_QfGKo...",
        "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d1b33a60-333f-4d6e-9ade-17a7020562a9/terminate?reason={text}&code=ACCupah_QfGKo..."
    }
    

    A resposta é o resultado inicial da função HTTP. Ele permite que você saiba que a orquestração durável começou com sucesso. Ainda não exibe o resultado final da orquestração. A resposta inclui alguns URLs úteis. Por enquanto, verifique o estado da orquestração.

  4. Copie o valor do URL para statusQueryGetUri, cole-o na barra de endereço do navegador e execute a solicitação. Como alternativa, você pode continuar a usar a ferramenta de teste HTTP para emitir a solicitação GET.

    A solicitação consulta o estado da instância de orquestração. Deve ver que a instância terminou e que inclui as saídas ou resultados da função durável, tal como mostrado neste exemplo:

    {
        "name": "Cities",
        "instanceId": "d1b33a60-333f-4d6e-9ade-17a7020562a9",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": "",
        "output":"TOKYO, LONDON, SEATTLE, AUSTIN",
        "createdTime": "2022-12-12T05:00:02Z",
        "lastUpdatedTime": "2022-12-12T05:00:06Z"
    }