Java'da ilk dayanıklı işlevinizi oluşturma

Dayanıklı İşlevler, sunucusuz bir ortamda durum bilgisi olan işlevler yazmanızı sağlayan bir Azure İşlevleri uzantısıdır. Uzantı sizin için durumu, denetim noktalarını ve yeniden başlatmaları yönetir.

Bu hızlı başlangıçta Java'da bir "Merhaba Dünya" Dayanıklı İşlevler uygulaması oluşturmayı ve test etmeyi öğreneceksiniz. En temel Dayanıklı İşlevler uygulaması aşağıdaki üç işlevi içerir:

  • Orchestrator işlevi - diğer işlevleri düzenleyen bir iş akışını açıklar.
  • Etkinlik işlevi - orchestrator işlevi tarafından çağrılır, iş gerçekleştirir ve isteğe bağlı olarak bir değer döndürür.
  • İstemci işlevi - düzenleyici işlevi başlatan normal bir Azure İşlevi. Bu örnekte HTTP ile tetiklenen bir işlev kullanılır.

Bu hızlı başlangıçta, farklı şekillerde yapabileceğiniz bu "Merhaba Dünya" uygulamasını nasıl oluşturacağınız gösterilir. Tercih ettiğiniz yaklaşımı seçmek için yukarıdaki seçiciyi kullanın.

Ön koşullar

Bu öğreticiyi tamamlamak için aşağıdakiler gerekir:

  • Java Geliştirici Seti, sürüm 8 veya üzeri.

  • Apache Maven, sürüm 3.0 veya üzeri.

  • Azure İşlevleri Core Tools'un en son sürümü.

    • Azure İşlevleri 4.x için Core Tools v4.0.4915 veya üzeri gereklidir.
  • Azure aboneliğinizin olmasını gerektiren bir Azure Depolama hesabı.

Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı oluşturun.

Projenize gerekli bağımlılıkları ve eklentileri ekleme

aşağıdakini ekleyin pom.xml:

<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>

Gerekli JSON dosyalarını ekleme

Proje dizininize bir host.json dosya ekleyin. Şunun gibi görünmelidir:

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

Dekont

Java için Dayanıklı İşlevler için şu anda yalnızca Azure İşlevleri v4 uzantı paketinin gerekli desteğe sahip olduğunu unutmayın. Java için Dayanıklı İşlevler v3 ve erken uzantı paketlerinde desteklenmez. Uzantı paketleri hakkında daha fazla bilgi için uzantı paketleri belgelerine bakın.

Dayanıklı İşlevler çalışma zamanı durumunu depolamak için bir depolama sağlayıcısı gerekir. Depolama sağlayıcısını yapılandırmak için proje dizininize bir local.settings.json dosya ekleyin. Sağlayıcı olarak Azure Depolama kullanmak için değerini AzureWebJobsStorage Azure Depolama hesabınızın bağlantı dizesi olarak ayarlayın:

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

İşlevlerinizi oluşturma

Aşağıdaki örnek kod, her birinin basit bir örneğini gösterir:

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

Maven komutuyla yerel proje oluşturma

  1. bir Dayanıklı İşlevler uygulamasının temel işlevleriyle bir proje oluşturmak için aşağıdaki komutu çalıştırın:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
  1. istemleri izleyin ve aşağıdaki bilgileri sağlayın:
İstem Değer
Groupıd com.function
Artifactıd myDurableFunction
version 1.0-SNAPSHOT
Paket com.function
Y Onaylamak için Enter tuşuna basın

Artık temel bir Dayanıklı İşlevler uygulaması için gereken üç işlevle oluşturulmuş yerel bir projeniz var.

Lütfen içinde pom.xmlbir bağımlılık olduğundan emin olmak com.microsoft:durabletask-azure-functions için denetleyin.

Arka uç depolama sağlayıcısını yapılandırma

Dayanıklı İşlevler çalışma zamanı durumunu depolamak için bir depolama sağlayıcısı gerekir. Azure Depolama hesabınızın bağlantı dizesi değerini olarak sağlayarak Azure Depolama'ı local.settings.json içinde depolama sağlayıcısı olarak kullanacak şekilde AzureWebJobsStorageyapılandırabilirsiniz:

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

Yerel projenizi oluşturma

  1. Visual Studio Code'da komut paletini açmak için F1 (veya Ctrl/Cmd+Shift+P) tuşlarına basın. Komut paletinde araması yapın ve öğesini seçin Azure Functions: Create New Project....

    Screenshot of create new functions project.

  2. Projeniz için boş bir klasör konumu seçin ve Seç'i seçin.

  3. istemleri izleyin ve aşağıdaki bilgileri sağlayın:

    İstem Değer
    Dil seçin Java öğesini seçin.
    Java sürümünü seçme İşlevlerinizin Azure'da çalıştığı Java sürümü olan veya daha yeni bir sürümü seçin Java 8 . Yerel olarak doğruladığınız bir Java sürümü seçin.
    Grup kimliği belirtin com.function.
    Yapıt kimliği sağlama myDurableFunction.
    Sürüm sağlama 1.0-SNAPSHOT.
    Paket adı belirtin com.function.
    Uygulama adı belirtin myDurableFunction.
    Java projesi için derleme aracını seçin Maven öğesini seçin.
    Projenizi nasıl açmak istediğinizi seçin Open in new window öğesini seçin.

Artık örnek http işlevine sahip bir projeniz var. bir sonraki adımda bir Dayanıklı İşlevler uygulamasının temel işlevlerini ekleyacağımız için isterseniz bu işlevi kaldırabilirsiniz.

Projeye işlev ekleme

  1. Komut paletinde araması yapın ve öğesini seçin Azure Functions: Create Function....

  2. öğesini seçin Change template filterAll.

  3. istemleri izleyin ve aşağıdaki bilgileri sağlayın:

    İstem Değer
    İşleviniz için şablon seçme DurableFunctionsOrchestration
    Paket adı belirtin com.function
    İşlev adı belirtin DurableFunctionsOrchestrator
  4. Depolama hesabı bilgilerini ayarlamak isteyip istemediğinizi soran açılır pencerede öğesini seçin Select storage account ve istemleri izleyin.

Artık bir Dayanıklı İşlevler uygulaması için üç temel işlevin oluşturulması gerekir.

pom.xml ve host.json'u yapılandırma

aşağıdaki bağımlılığınıza pom.xmlekleyin:

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

özelliğine extensionshost.jsonekleyin:

"extensions": { "durableTask": { "hubName": "JavaTestHub" }}

İşlevi yerel olarak test etme

Azure İşlevleri Temel Araçları, Azure İşlevleri projenizi yerel geliştirme bilgisayarınızda çalıştırmanıza olanak sağlar.

Dekont

Java için Dayanıklı İşlevler için Azure İşlevleri Core Tools v4.0.4915 veya üzeri gerekir. Terminalden komutunu çalıştırarak hangi sürümün func --version yüklü olduğunu görebilirsiniz.

  1. Visual Studio Code kullanıyorsanız yeni bir terminal penceresi açın ve projeyi oluşturmak için aşağıdaki komutları çalıştırın:

    mvn clean package
    

    Ardından dayanıklı işlevi çalıştırın:

    mvn azure-functions:run
    
  2. Terminal panelinde, HTTP ile tetiklenen işlevinizin URL uç noktasını kopyalayın.

    Screenshot of Azure local output.

  3. Postman veya cURL gibi bir araç kullanarak URL uç noktasına bir HTTP POST isteği gönderin. Aşağıdakine benzer bir yanıt almanız gerekir:

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

    Yanıt, HTTP işlevinin dayanıklı düzenlemenin başarıyla başladığını bildiren ilk sonucudur. Henüz düzenlemenin sonucu değildir. Yanıt birkaç yararlı URL içerir. Şimdilik düzenlemenin durumunu sorgulayalım.

  4. url statusQueryGetUri değerini kopyalayıp tarayıcının adres çubuğuna yapıştırın ve isteği yürütür. Alternatif olarak, GET isteğini vermek için Postman veya cURL kullanmaya devam edebilirsiniz.

    İstek, durum için düzenleme örneğini sorgular. Örneğin tamamlandığını gösteren ve dayanıklı işlevin çıkışlarını veya sonuçlarını içeren nihai bir yanıt almanız gerekir. Şuna benzer:

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