Mulai Cepat: Membuat aplikasi Java Durable Functions

Gunakan Durable Functions, fitur Azure Functions, untuk menulis fungsi stateful di lingkungan tanpa server. Durable Functions mengelola status, titik pemeriksaan, dan memulai ulang di aplikasi Anda.

Dalam panduan cepat ini, Anda membuat dan menguji aplikasi Durable Functions dengan Java.

Aplikasi Durable Functions dasar memiliki tiga fungsi:

  • Fungsi orkestrator (Cities): Alur kerja yang mengatur fungsi lain.
  • Fungsi aktivitas (Capitalize): Fungsi yang dipanggil orkestrator untuk melakukan pekerjaan dan mengembalikan nilai.
  • Fungsi klien (StartOrchestration): Fungsi yang dipicu HTTP yang memulai orkestrator.

Panduan memulai cepat ini memiliki tiga jalur penyiapan. Gunakan pemilih di bagian atas halaman untuk memilih pendekatan pilihan Anda:

  • Penyiapan manual: Buat setiap file secara manual untuk kontrol penuh atas struktur proyek.
  • Perintah Maven: Gunakan arketipe Maven untuk membuat perancah proyek dalam satu perintah.
  • Visual Studio Code: Gunakan ekstensi Azure Functions Visual Studio Code untuk menghasilkan proyek melalui UI terpandu.

Prasyarat

Untuk menyelesaikan panduan memulai cepat ini, Anda memerlukan:

  • Java Developer Kit versi 8 atau yang lebih baru terinstal.

  • Apache Maven versi 3.0 atau yang lebih baru terinstal.

  • Versi terbaru Azure Functions Core Tools.

    Untuk Azure Functions 4.x, Core Tools versi 4.0.4915 atau yang lebih baru diperlukan.

  • Alat uji HTTP yang menjaga keamanan data Anda. Untuk informasi selengkapnya, lihat Alat pengujian HTTP.

  • Visual Studio Code dengan ekstensi Azure Functions terinstal (hanya diperlukan untuk jalur penyiapan Visual Studio Code).

  • Sebuah langganan Azure. Untuk menggunakan Durable Functions, Anda harus memiliki akun Azure Storage.

Jika Anda tidak memiliki akun Azure, buat akun gratis sebelum memulai.

Menambahkan dependensi dan plugin yang diperlukan ke proyek Anda

Tambahkan kode berikut ke file pom.xml Anda. Sebelum Anda menyalinnya, ganti your-unique-app-name dengan nama aplikasi fungsi yang unik secara global. Sesuaikan region, javaVersion, dan resourceGroup agar sesuai dengan lingkungan Anda.

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

Menambahkan file JSON yang diperlukan

Tambahkan file host.json ke direktori proyek Anda. Ini akan terlihat mirip dengan contoh berikut:

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

Nota

Durable Functions untuk Java memerlukan bundel ekstensi v4. Paket sebelumnya tidak didukung. Untuk informasi selengkapnya, lihat dokumentasi bundel ekstensi.

Durable Functions membutuhkan penyedia penyimpanan untuk menyimpan status runtime. Tambahkan file local.settings.json ke direktori proyek Anda untuk mengonfigurasi penyedia penyimpanan. Untuk menggunakan Azure Storage sebagai penyedia, atur nilai AzureWebJobsStorage ke string koneksi akun Azure Storage Anda:

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

Important

File local.settings.json dapat berisi rahasia. Pastikan Anda menambahkannya ke file .gitignore Anda untuk menghindari penerapannya ke kontrol sumber.

Buat fungsi orkestrator, aktivitas, dan klien Durable Functions Anda

Contoh kode berikut menunjukkan contoh dasar dari setiap jenis fungsi:

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

Membuat proyek Durable Functions lokal dengan menggunakan perintah Maven

Jalankan perintah berikut untuk menghasilkan proyek yang berisi fungsi dasar aplikasi Durable Functions:

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

Pada perintah, berikan informasi berikut:

Petunjuk Action
groupId Masukkan com.function.
artifactId Masukkan myDurableFunction.
versi Pilih 1.0-SNAPSHOT.
package Masukkan com.function.
Y Masukkan Y dan pilih Enter untuk mengonfirmasi.

Sekarang Anda memiliki proyek lokal yang memiliki tiga fungsi yang ada di aplikasi Durable Functions dasar. Arketipe ini menyertakan com.microsoft:durabletask-azure-functions sebagai dependensi dalam file pom.xml Anda secara otomatis.

Mengonfigurasi penyedia penyimpanan back-end untuk Durable Functions

Durable Functions membutuhkan penyedia penyimpanan untuk menyimpan status runtime. Anda dapat mengatur Azure Storage sebagai penyedia penyimpanan di local.settings.json. Gunakan string koneksi akun penyimpanan Azure Anda sebagai nilai untuk AzureWebJobsStorage seperti dalam contoh ini:

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

Important

File local.settings.json dapat berisi rahasia. Pastikan Anda menambahkannya ke file .gitignore Anda untuk menghindari penerapannya ke kontrol sumber.

Membuat proyek lokal Anda

  1. Di Visual Studio Code, pilih F1 (atau pilih Ctrl/Cmd+Shift+P) untuk membuka palet perintah. Pada perintah (>), masukkan lalu pilih Azure Functions: Buat Proyek Baru.

    Screenshot dari perintah Azure Functions Buat Project Baru di palet perintah Visual Studio Code.

  2. Pilih Telusuri. Dalam dialog Pilih Folder, buka folder yang akan digunakan untuk proyek Anda, lalu pilih Pilih.

  3. Pada perintah, berikan informasi berikut:

    Petunjuk Action
    Pilih Bahasa Pilih Java.
    Pilih versi Java Pilih Java 8 atau lebih baru. Pilih versi Java yang dijalankan fungsi Anda di Azure, dan versi yang Anda verifikasi secara lokal.
    Berikan ID grup Masukkan com.function.
    Berikan ID artefak Masukkan myDurableFunction.
    Berikan versi Masukkan 1.0-SNAPSHOT.
    Berikan nama paket Masukkan com.function.
    Berikan nama aplikasi Masukkan myDurableFunction.
    Pilih alat build untuk proyek Java Pilih Maven.
    Pilih bagaimana Anda ingin membuka proyek Anda Pilih Buka di jendela baru.

Anda sekarang memiliki proyek yang memiliki contoh fungsi HTTP. Anda dapat menghapus fungsi HTTP yang dihasilkan, karena Anda menambahkan Durable Functions di langkah berikutnya.

Menambahkan fungsi ke proyek

  1. Di palet perintah, masukkan lalu pilih Azure Functions: Buat Fungsi.

  2. Untuk Ubah filter templat, pilih Semua.

  3. Pada perintah, berikan informasi berikut:

    Petunjuk Action
    Pilih templat untuk fungsi Anda Pilih DurableFunctionsOrchestration.
    Berikan nama paket Masukkan com.function.
    Berikan nama fungsi Masukkan DurableFunctionsOrchestrator.
  4. Dalam dialog, pilih Pilih akun penyimpanan untuk menyiapkan akun penyimpanan, lalu ikuti perintah.

Anda sekarang harus memiliki tiga fungsi dasar yang dihasilkan untuk aplikasi Durable Functions.

Mengonfigurasi pom.xml dan host.json untuk Durable Functions

Tambahkan dependensi berikut ke file pom.xml Anda:

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

Tambahkan properti ke extensions file host.json Anda. Jika file sudah memiliki properti lain, gabungkan extensions blok ke JSON yang ada:

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

Uji fungsi secara lokal

Azure Functions Core Tools memberi Anda kemampuan untuk menjalankan proyek Azure Functions di komputer pengembangan lokal Anda.

  1. Jika Anda menggunakan Visual Studio Code, buka jendela terminal baru dan jalankan perintah berikut untuk membangun proyek:

    mvn clean package
    

    Kemudian, jalankan fungsi tahan lama:

    mvn azure-functions:run
    
  2. Di panel terminal, salin titik akhir URL fungsi yang dipicu HTTP Anda.

    Screenshot output terminal memperlihatkan URL titik akhir HTTP untuk runtime Azure Functions lokal.

  3. Gunakan alat uji HTTP Anda untuk mengirim permintaan HTTP POST ke titik akhir URL.

    Responsnya akan terlihat seperti contoh berikut:

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

    Responsnya adalah hasil awal fungsi HTTP. Ini memungkinkan Anda tahu bahwa orkestrasi tahan lama berhasil dimulai. Ini belum menampilkan hasil akhir orkestrasi. Respons mencakup beberapa URL yang berguna. Untuk saat ini, periksa status orkestrasi.

  4. Salin nilai URL untuk statusQueryGetUri, tempelkan di bilah alamat browser Anda, dan jalankan permintaan. Atau, Anda dapat terus menggunakan alat uji HTTP untuk mengeluarkan permintaan GET.

    Permintaan mengakses instance orkestrasi untuk status. Anda dapat melihat bahwa instans telah selesai dan mencakup output atau hasil dari fungsi durabel, seperti dalam contoh ini:

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