Membuat fungsi tahan lama pertama Anda di Java

Fungsi Tahan Lama merupakan ekstensi dari Azure Functions yang memungkinkan Anda menulis fungsi stateful di lingkungan komputasi tanpa server. Ekstensi ini mengelola status, titik pemeriksaan, dan menghidupkan ulang untuk Anda.

Dalam mulai cepat ini, Anda akan mempelajari cara membuat dan menguji aplikasi Durable Functions "Halo Dunia" di Java. Aplikasi Durable Functions paling dasar berisi tiga fungsi berikut:

  • Fungsi orkestrator - menjelaskan alur kerja yang mengatur fungsi lain.
  • Fungsi aktivitas - dipanggil oleh fungsi orkestrator, melakukan pekerjaan, dan mengembalikan nilai secara opsional.
  • Fungsi klien - Azure Function reguler yang memulai fungsi orkestrator. Contoh ini menggunakan fungsi yang dipicu HTTP.

Mulai cepat ini akan menunjukkan kepada Anda cara membuat aplikasi "Halo Dunia" ini, yang dapat Anda lakukan dengan cara yang berbeda. Gunakan pemilih di atas untuk memilih pendekatan pilihan Anda.

Prasyarat

Untuk menyelesaikan tutorial ini, Anda perlu:

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

  • Apache Maven, versi 3.0 atau yang lebih baru.

  • Versi terbaru dari Azure Functions Core Tools.

    • Untuk Azure Functions 4.x, Core Tools v4.0.4915 atau yang lebih baru diperlukan.
  • Akun Azure Storage, yang mengharuskan Anda memiliki langganan Azure.

Jika Anda tidak memiliki Langganan Azure, buat Akun gratis Azure sebelum memulai.

Menambahkan dependensi dan plugin yang diperlukan ke proyek Anda

Tambahkan yang berikut ke pom.xml 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. Tampilannya akan terlihat seperti 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)"
  }
}

Catatan

Penting untuk dicatat bahwa hanya bundel ekstensi Azure Functions v4 yang saat ini memiliki dukungan yang diperlukan untuk Durable Functions untuk Java. Durable Functions untuk Java tidak didukung dalam bundel ekstensi v3 dan awal. Untuk informasi selengkapnya tentang bundel ekstensi, lihat dokumentasi bundel ekstensi.

Durable Functions membutuhkan penyedia penyimpanan untuk menyimpan status runtime. local.settings.json Tambahkan file 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"
  }
}

Membuat fungsi Anda

Sampel kode di bawah ini menunjukkan contoh sederhana dari masing-masing:

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

Membuat proyek lokal dengan perintah Maven

  1. Jalankan perintah berikut untuk menghasilkan proyek dengan fungsi dasar aplikasi Durable Functions:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
  1. Ikuti perintahnya dan berikan informasi berikut:
Prompt Nilai
groupId com.function
artifactId myDurableFunction
versi 1.0-SNAPSHOT
package com.function
Y Tekan enter untuk mengonfirmasi

Sekarang Anda memiliki proyek lokal yang dihasilkan dengan tiga fungsi yang diperlukan untuk aplikasi Durable Functions dasar.

Silakan periksa untuk memastikan Anda memiliki com.microsoft:durabletask-azure-functions sebagai dependensi di .pom.xml

Mengonfigurasi penyedia penyimpanan backend

Durable Functions membutuhkan penyedia penyimpanan untuk menyimpan status runtime. Anda dapat mengonfigurasi untuk menggunakan Azure Storage sebagai penyedia local.settings.json penyimpanan dengan menyediakan string koneksi akun Azure Storage Anda sebagai nilai untuk AzureWebJobsStorage:

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

Membuat proyek lokal Anda

  1. Di Visual Studio Code, tekan F1 (atau Ctrl/Cmd+Shift+P) untuk membuka palet perintah. Di palet perintah, cari dan pilih Azure Functions: Create New Project....

    Screenshot of create new functions project.

  2. Pilih lokasi folder kosong untuk proyek Anda dan pilihPilih.

  3. Ikuti perintahnya dan berikan informasi berikut:

    Prompt Nilai
    Pilih Bahasa Pilih Java.
    Pilih versi Java Pilih Java 8 atau yang lebih baru, versi Java tempat fungsi Anda berjalan di Azure. Pilih versi Java yang telah Anda verifikasi secara lokal.
    Berikan ID grup com.function.
    Berikan ID artefak myDurableFunction.
    Berikan versi 1.0-SNAPSHOT.
    Berikan nama paket com.function.
    Berikan nama aplikasi myDurableFunction.
    Pilih alat build untuk proyek Java Pilih Maven.
    Pilih bagaimana Anda ingin membuka proyek Anda Pilih Open in new window.

Anda sekarang memiliki proyek dengan contoh fungsi HTTP. Anda dapat menghapus fungsi ini jika Anda mau karena kami akan menambahkan fungsi dasar aplikasi Durable Functions di langkah berikutnya.

Menambahkan fungsi ke proyek

  1. Di palet perintah, cari dan pilih Azure Functions: Create Function....

  2. Pilih Change template filter ke All.

  3. Ikuti perintahnya dan berikan informasi berikut:

    Prompt Nilai
    Pilih templat untuk fungsi Anda DurableFungsiOrchestration
    Berikan nama paket com.function
    Berikan nama fungsi DurableFunctionsOrchestrator
  4. Pilih Select storage account di jendela pop-up yang meminta untuk menyiapkan informasi akun penyimpanan dan mengikuti perintah.

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

Mengonfigurasi pom.xml dan host.json

Tambahkan dependensi berikut ke pom.xml:

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

Tambahkan properti ke extensionshost.json:

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

Uji fungsi secara lokal

Azure Functions Core Tools memungkinkan Anda menjalankan proyek Azure Functions di komputer pengembangan lokal Anda.

Catatan

Durable Functions untuk Java memerlukan Azure Functions Core Tools v4.0.4915 atau yang lebih baru. Anda dapat melihat versi mana yang diinstal dengan menjalankan func --version perintah dari terminal.

  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 panelTerminal, salin titik akhir URL dari fungsi yang dipicu HTTP Anda.

    Screenshot of Azure local output.

  3. Gunakan browser Anda, atau alat seperti PostmanataucURL, kirim permintaan HTTP POST ke titik akhir URL. Anda akan mendapatkan respons yang mirip dengan respons berikut:

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

    Responsnya adalah hasil awal dari fungsi HTTP yang memberi tahu Anda orkestrasi tahan lama telah berhasil dimulai. Proses ini bukan merupakan hasil akhir dari orkestrasi. Respons mencakup beberapa URL yang berguna. Untuk saat ini, mari buat kueri status orkestrasi.

  4. Salin nilai URL untukstatusQueryGetUridan tempelkan di bilah alamat browser dan jalankan permintaan. Atau Anda juga dapat terus menggunakan Postman atau cURL untuk mengeluarkan permintaan GET.

    Permintaan akan membuat kueri instans orkestrasi untuk status tersebut. Anda harus mendapatkan respons pada akhirnya, yang menunjukkan kepada kami instans telah selesai, dan termasuk output atau hasil dari fungsi tahan lama. Respons terlihat seperti:

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