Rövid útmutató: Java Durable Functions-alkalmazás létrehozása

A Azure Functions egyik funkciója, a Durable Functions használatával állapotalapú függvényeket írhat kiszolgáló nélküli környezetben. Durable Functions kezeli az alkalmazás állapotát, ellenőrzőpontjait és újraindításait.

Ebben a gyors kezdési útmutatóban létrehoz és tesztel egy Durable Functions alkalmazást Java nyelven.

Egy alapszintű Durable Functions-alkalmazás három funkcióval rendelkezik:

  • Vezénylő függvény (Cities): Más függvényeket vezénylő munkafolyamat.
  • Tevékenységfüggvény (Capitalize): Az a függvény, amelyet a vezénylő a munka elvégzésére hív fel, és egy értéket ad vissza.
  • Ügyfélfüggvény (StartOrchestration): HTTP-aktivált függvény, amely elindítja az orchestrátort.

Ez a rövid útmutató három beállítási útvonalat kínál. Az előnyben részesített megközelítés kiválasztásához használja az oldal tetején található választógombot:

  • Manuális beállítás: Minden fájlt kézzel hozhat létre a projektstruktúra teljes körű vezérléséhez.
  • Maven-parancs: Egy Maven-archetípus használatával egy parancsban hozhatja létre a projektet.
  • Visual Studio Code: A VS Code Azure Functions bővítmény használatával generálhatja a projektet egy irányított felhasználói felületen keresztül.

Prerequisites

A gyors kezdéshez ezekre lesz szüksége:

  • A Java Developer Kit 8- vagy újabb verziója telepítve van.

  • Az Apache Maven 3.0-s vagy újabb verziója telepítve van.

  • Az Azure Functions Core Tools legújabb verziója.

    Az Azure Functions 4.x esetében a Core Tools 4.0.4915-ös vagy újabb verziójára van szükség.

  • EGY HTTP-teszteszköz , amely biztonságossá teszi az adatokat. További információ: HTTP-teszteszközök.

  • Visual Studio Code a Azure Functions kiterjesztéssel telepítve (csak a Visual Studio Code beállítási útvonalhoz szükséges).

  • Azure-előfizetés. A Durable Functions használatához rendelkeznie kell egy Azure Storage fiókkal.

Ha nem rendelkezik Azure-fiókkal, a kezdés előtt hozzon létre egy ingyenes fiókot .

Szükséges függőségek és beépülő modulok hozzáadása a projekthez

Adja hozzá a következő kódot a pom.xml fájlhoz. A másolás előtt cserélje le your-unique-app-name egy globálisan egyedi függvényalkalmazás nevére. Állítsa be a region, javaVersion és resourceGroup elemeket, hogy igazodjanak a környezetéhez.

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

Adja hozzá a szükséges JSON-fájlokat

Vegyen fel egy host.json fájlt a projektkönyvtárba. A következő példához hasonlóan kell kinéznie:

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

Note

Durable Functions Java esetén bővítménycsomag v4 szükséges. A korábbi csomagok nem támogatottak. További információkért tekintse meg a bővítménycsomagok dokumentációját.

A Durable Functionsnek szüksége van egy tárolószolgáltatóra a futtatókörnyezet állapotának tárolásához. Adjon hozzá egy local.settings.json fájlt a projektkönyvtárhoz a társzolgáltató konfigurálásához. Az Azure Storage szolgáltatóként való használatához állítsa be az Azure Storage-fiók kapcsolati sztring értékétAzureWebJobsStorage:

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

Important

A local.settings.json fájl titkos kulcsokat tartalmazhat. Győződjön meg arról, hogy hozzáadja a .gitignore fájlhoz, hogy elkerülje az elmentését a forrásvezérlőbe.

Hozz létre a Durable Functions-vezénylőt, feladatokat és kliensfunkciókat

Az alábbi mintakód egy egyszerű példát mutat be az egyes függvénytípusokra:

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

Helyi Durable Functions projekt létrehozása a Maven paranccsal

Futtassa a következő parancsot egy olyan projekt létrehozásához, amely egy Durable Functions alkalmazás alapfüggvényeit tartalmazza:

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

A parancssorban adja meg a következő információkat:

Haladéktalan Action
groupId Írja be a com.function függvényt.
artifactId Adja meg a myDurableFunction parancsot.
verzió Válassza az 1.0-PILLANATKÉP lehetőséget.
csomag Írja be a com.function függvényt.
Y Írja be az Y értéket, és a megerősítéshez válassza az Enter billentyűt.

Most már van egy helyi projektje, amely egy alapszintű Durable Functions-alkalmazásban található három függvényt tartalmazza. Az archetípus automatikusan függőségként szerepel com.microsoft:durabletask-azure-functions a pom.xml fájlban.

A Durable Functions háttértárszolgáltatójának konfigurálása

A Durable Functionsnek szüksége van egy tárolószolgáltatóra a futtatókörnyezet állapotának tárolásához. Az Azure Storage-t a local.settings.json társzolgáltatójaként állíthatja be. Használja az Azure Storage-fiók kapcsolati sztringjét az alábbi példában AzureWebJobsStorage értékként:

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

Important

A local.settings.json fájl titkos kulcsokat tartalmazhat. Győződjön meg arról, hogy hozzáadja a .gitignore fájlhoz, hogy elkerülje az elmentését a forrásvezérlőbe.

Helyi projekt létrehozása

  1. A Visual Studio Code válassza az F1 (vagy a Ctrl/Cmd+Shift+P) billentyűkombinációt a parancskatalógus megnyitásához. A promptnál (>) írja be, majd válassza a Azure Functions: Új projekt létrehozása lehetőséget.

    Az Azure Functions Új Projekt Létrehozása parancs képernyőképe a Visual Studio Code parancspalettájában.

  2. Válassza a Tallózás lehetőséget. A Mappa kiválasztása párbeszédpanelen lépjen a projekthez használni kívánt mappára, majd válassza a Kiválasztás lehetőséget.

  3. A parancssorban adja meg a következő információkat:

    Haladéktalan Action
    Nyelv kiválasztása Válassza a Java lehetőséget.
    A Java Válassza a Java 8 vagy újabb verzióját. Válassza ki azt a Java-verziót, amelyen a függvények futnak az Azure-ban, és amelyiket helyileg ellenőrizte.
    Csoportazonosító megadása Írja be a com.function függvényt.
    Összetevő-azonosító megadása Adja meg a myDurableFunction parancsot.
    Verzió megadása Adja meg 1.0-SNAPSHOT-t.
    Adja meg a csomag nevét Írja be a com.function függvényt.
    Alkalmazásnév megadása Adja meg a myDurableFunction parancsot.
    A buildelési eszköz kijelölése Java projekthez Válassza a Maven lehetőséget.
    Válassza ki, hogyan szeretné megnyitni a projektet Válassza a Megnyitás új ablakban lehetőséget.

Most már van egy projektje, amely tartalmaz egy HTTP példafüggvényt. Eltávolíthatja a létrehozott HTTP-függvényt, mert a következő lépésben hozzáadja a tartós funkciókat.

Függvények hozzáadása a projekthez

  1. A parancskatalógusban írja be az Azure Functions: Függvény létrehozása parancsot, majd válassza ki azt.

  2. A sablonszűrő módosításához válassza az Összes lehetőséget.

  3. A parancssorban adja meg a következő információkat:

    Haladéktalan Action
    Sablon kiválasztása a függvényhez Válassza a DurableFunctionsOrchestration lehetőséget.
    Adja meg a csomag nevét Írja be a com.function függvényt.
    Függvénynév megadása Adja meg a DurableFunctionsOrchestrator-t.
  4. A párbeszédpanelen válassza a Tárfiók kiválasztása lehetőséget a tárfiók beállításához, majd kövesse az utasításokat.

Most létre kell hoznia a Durable Functions-alkalmazásokhoz létrehozott három alapfüggvényt.

pom.xml és host.json konfigurálása a Durable Functions számára

Adja hozzá a következő függőséget a pom.xml fájlhoz:

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

Adja hozzá a extensions tulajdonságot a host.json fájlhoz. Ha a fájl már rendelkezik más tulajdonságokkal, egyesítse a extensions blokkot a meglévő JSON-fájlba:

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

A függvény helyi tesztelése

Azure Functions Core Tools lehetővé teszi egy Azure Functions projekt futtatását a helyi fejlesztési számítógépen.

  1. Ha Visual Studio Code-ot használ, nyisson meg egy új terminálablakot, és futtassa a következő parancsokat a projekt létrehozásához:

    mvn clean package
    

    Ezután futtassa a tartós függvényt:

    mvn azure-functions:run
    
  2. A terminálpanelen másolja ki a HTTP-aktivált függvény URL-végpontját.

    A terminálkimenet képernyőképe, amely a helyi Azure Functions futási környezet HTTP-végpontjának URL-címét mutatja.

  3. A HTTP-teszteszköz használatával HTTP POST-kérést küldhet az URL-végpontnak.

    A válasznak a következő példához hasonlóan kell kinéznie:

    {
        "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 válasz a HTTP-függvény kezdeti eredménye. Tájékoztatja Önt, hogy a tartós folyamatvezérlés sikeresen elindult. Még nem jeleníti meg a vezénylés végeredményét. A válasz tartalmaz néhány hasznos URL-címet. Egyelőre kérdezze le a vezénylés állapotát.

  4. Másolja ki a cél URL-címét statusQueryGetUri, illessze be a böngésző címsorában, és hajtsa végre a kérést. Másik lehetőségként továbbra is használhatja a HTTP-teszteszközt a GET kérés kiadásához.

    A kérés lekérdezi az orkesztációs példányt az állapotáról. Látnia kell, hogy a példány befejeződött, és tartalmazza a tartós függvény kimeneteit vagy eredményeit, például ebben a példában:

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