Hızlı Başlangıç: Java Dayanıklı İşlevler uygulaması oluşturma

Sunucusuz bir ortamda durum bilgisi olan işlevleri yazmak için Azure İşlevleri özelliği olan Dayanıklı İşlevler kullanın. Dayanıklı İşlevler uygulamanızdaki durumu, denetim noktalarını ve yeniden başlatmaları yönetir.

Bu hızlı başlangıçta, Java'da bir Dayanıklı İşlevler uygulaması oluşturup test edin.

Temel bir Dayanıklı İşlevler uygulamasının üç işlevi vardır:

  • Orchestrator işlevi (Cities): Diğer işlevleri düzenleyen bir iş akışı.
  • Etkinlik fonksiyonu (Capitalize): Orchestrator tarafından işi gerçekleştirmek ve bir değer döndürmek amacıyla çağrılan bir fonksiyon.
  • İstemci işlevi (StartOrchestration): Düzenleyiciyi başlatan HTTP ile tetiklenen bir işlev.

Bu hızlı başlangıçta üç kurulum yolu sunulmaktadır. Tercih ettiğiniz yaklaşımı seçmek için sayfanın üst kısmındaki seçiciyi kullanın:

  • El ile kurulum: Proje yapısı üzerinde tam denetim için her dosyayı el ile oluşturun.
  • Maven komutu: Projeyi tek bir komutla iskelesini oluşturmak için Maven arketipi kullanın.
  • Visual Studio Code: Projeyi kılavuzlu bir kullanıcı arabirimi aracılığıyla oluşturmak için VS Code Azure İşlevleri uzantısını kullanın.

Önkoşullar

Bu hızlı başlangıcı tamamlamak için şunları yapmanız gerekir:

  • Java Developer Kit sürüm 8 veya üzeri yüklü.

  • Apache Maven sürüm 3.0 veya üzeri yüklü.

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

    Azure İşlevleri 4.x için Core Tools sürüm 4.0.4915 veya üzeri gereklidir.

  • Verilerinizin güvenliğini sağlayan bir HTTP test aracı. Daha fazla bilgi için bkz . HTTP test araçları.

  • Visual Studio Code ile Azure İşlevleri uzantısı yüklü (yalnızca Visual Studio Code kurulum yolu için gereklidir).

  • Azure aboneliği. Dayanıklı İşlevler kullanmak için bir Azure Depolama hesabınız olmalıdır.

Azure hesabınız yoksa, başlamadan önce ücretsiz hesap oluşturun.

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

aşağıdaki kodupom.xml dosyanıza ekleyin. Kopyalamadan önceki adımda, küresel olarak benzersiz bir işlev uygulaması adı ile your-unique-app-name'yi değiştirin. , regionve javaVersion ayarlarını ortamınızla eşleşecek şekilde ayarlayınresourceGroup.

<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 dosyası ekleyin. Aşağıdaki örneğe benzer 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)"
  }
}

Uyarı

Java için Dayanıklı İşlevler için v4 uzantı paketi gerekir. Önceki paketler desteklenmez. 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 dosyası ekleyin. Sağlayıcı olarak Azure Depolama'yı kullanmak için, AzureWebJobsStorage değerini 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"
  }
}

Important

local.settings.json dosyası gizli diziler içerebilir. Kaynak denetimine işlemekten kaçınmak için .gitignore dosyanıza eklediğinizden emin olun.

Dayanıklı İşlevler düzenleyicinizi, etkinliğinizi ve istemci işlevlerinizi oluşturma

Aşağıdaki örnek kod, her işlev türünün temel 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 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();
    }
}

Maven komutunu kullanarak yerel Dayanıklı İşlevler projesi oluşturma

Dayanıklı İşlevler uygulamasının temel işlevlerini içeren 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.62 -Dtrigger=durablefunctions

İstemlerde aşağıdaki bilgileri sağlayın:

Uyarı Eylem
groupId com.function girin.
artifactId myDurableFunction girin.
version 1.0-SNAPSHOT seçeneğini belirleyin.
paket com.function girin.
Y Onaylamak için Y girin ve Enter tuşuna basın.

Artık temel bir Dayanıklı İşlevler uygulamasında bulunan üç işleve sahip yerel bir projeniz var. Arketip, com.microsoft:durabletask-azure-functions dosyanızda otomatik olarak bir bağımlılık olarak bulunur.

arka uç depolama sağlayıcısını Dayanıklı İşlevler için yapılandırma

Dayanıklı İşlevler çalışma zamanı durumunu depolamak için bir depolama sağlayıcısı gerekir. Azure Depolama'yı local.settings.json'da depolama sağlayıcısı olarak ayarlayabilirsiniz. Azure depolama hesabınızın bağlantı dizesi değerini şu örnekte olduğu AzureWebJobsStorage gibi kullanın:

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

Important

local.settings.json dosyası gizli diziler içerebilir. Kaynak denetimine yüklemekten kaçınmak için .gitignore dosyasına eklemenizden emin olun.

Yerel projenizi oluşturma

  1. Visual Studio Code komut paletini açmak için F1'i seçin (veya Ctrl/Cmd+Shift+P'yi seçin). İstemde (>), girin ve Azure İşlevleri: Yeni Proje Oluştur öğesini seçin.

    Visual Studio Code komut paletindeki Azure İşlevleri Yeni Proje Oluştur komutunun ekran görüntüsü.

  2. Göz at seçeneğini seçin. Klasör Seç iletişim kutusunda, projeniz için kullanılacak klasöre gidin ve Seç'i seçin.

  3. İstemlerde aşağıdaki bilgileri sağlayın:

    Uyarı Eylem
    Dil seçin Java'ya tıklayın.
    Java Java 8 veya sonraki bir sürümü seçin. İşlevlerinizin Azure'da çalıştırıldığı Java sürümünü ve yerel olarak doğruladığınız sürümü seçin.
    Grup kimliği belirtin com.function girin.
    Yapıt kimliği sağlama myDurableFunction girin.
    Sürüm belirleyin 1.0-SNAPSHOT girin.
    Paket adı belirtin com.function girin.
    Uygulama adı belirtin myDurableFunction girin.
    Java projesi için derleme aracını seçin Maven'ı seçin.
    Projenizi nasıl açmak istediğinizi seçin Yeni pencerede aç'ı seçin.

Artık örnek bir HTTP işlevine sahip bir projeniz var. Bir sonraki adımda Dayanıklı İşlevler eklediğinizden, oluşturulan HTTP işlevini kaldırabilirsiniz.

Projeye işlev ekleme

  1. Komut paletine Azure İşlevleri: İşlev Oluştur yazın ve seçin.

  2. Şablon filtresini değiştir için Tümü'ne tıklayın.

  3. İstemlerde aşağıdaki bilgileri sağlayın:

    Uyarı Eylem
    İşleviniz için şablon seçme DurableFunctionsOrchestration öğesini seçin.
    Paket adı belirtin com.function girin.
    İşlev adı belirtin DurableFunctionsOrchestrator girin.
  4. İletişim kutusunda Depolama hesabını seç'in ardından bir depolama hesabı ayarlayın ve yönlendirmeleri izleyin.

Artık bir Dayanıklı İşlevler uygulaması için oluşturulan üç temel işleve sahip olmanız gerekir.

Dayanıklı İşlevler için pom.xml ve host.json yapılandırma

pom.xml dosyanıza aşağıdaki bağımlılığı ekleyin:

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

extensions özelliğini host.json dosyanıza ekleyin. Dosyada zaten başka özellikler varsa bloğu mevcut JSON ile birleştirin extensions :

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

İşlevi yerel olarak test etme

Azure İşlevleri Temel Araçları, yerel geliştirme bilgisayarınızda bir Azure İşlevleri projesi çalıştırma olanağı sağlar.

  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şlevini çalıştırın:

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

    Yerel Azure İşlevleri çalıştırma ortamı için HTTP uç nokta URL'sini gösteren terminal çıktısının ekran görüntüsü.

  3. URL uç noktasına HTTP POST isteği göndermek için HTTP test aracınızı kullanın.

    Yanıt aşağıdaki örneğe benzer görünmelidir:

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

    Yanıt, HTTP işlevinin ilk sonucudur. Dayanıklı düzenleme işleminin başarıyla başladığını size bildirir. Henüz orkestrasyonun nihai sonucunu görüntülemez. Yanıt birkaç yararlı URL içerir. Şimdilik düzenlemenin durumunu sorgula.

  4. URL statusQueryGetUri değerini kopyalayın, Tarayıcınızın adres çubuğuna yapıştırın ve isteği yürütün. Alternatif olarak, GET isteğini vermek için HTTP test aracını kullanmaya devam edebilirsiniz.

    İstek, durum için orkestrasyon örneğini sorgular. Örneklemin tamamlandığını ve bu örnekte olduğu gibi dayanıklı işlevin çıkışlarını veya sonuçlarını içerdiğini kontrol etmeniz gerekir:

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