Uw eerste duurzame functie maken in Java
Durable Functions is een extensie van Azure Functions waarmee u stateful functies kunt schrijven in een serverloze omgeving. Met de extensie worden status, controlepunten en het opnieuw opstarten voor u beheerd.
In deze quickstart leert u hoe u een Durable Functions-app voor 'Hallo wereld' maakt en test in Java. De meest eenvoudige Durable Functions-app bevat de volgende drie functies:
- Orchestrator-functie: beschrijft een werkstroom die andere functies organiseert.
- Activiteitfunctie: wordt aangeroepen door de Orchestrator-functie, voert het werk uit en retourneert optioneel een waarde.
- Clientfunctie: een reguliere Azure-functie waarmee een Orchestrator-functie wordt gestart. In dit voorbeeld wordt een door HTTP geactiveerde functie gebruikt.
In deze quickstart ziet u hoe u deze 'Hallo wereld'-app maakt, die u op verschillende manieren kunt doen. Gebruik de bovenstaande selector om uw voorkeursbenadering te kiezen.
Vereisten
U hebt het volgende nodig om deze zelfstudie te voltooien:
De Java Developer Kit, versie 8 of hoger.
Apache Maven, versie 3.0 of hoger.
Nieuwste versie van de Azure Functions Core Tools.
- Voor Azure Functions 4.x is Core Tools v4.0.4915 of hoger vereist.
Een Azure Storage-account dat vereist dat u een Azure-abonnement hebt.
Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.
Vereiste afhankelijkheden en invoegtoepassingen toevoegen aan uw project
Voeg het volgende toe aan uw 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>
Vereiste JSON-bestanden toevoegen
Voeg een host.json
bestand toe aan de projectmap. Dit moet er ongeveer als volgt uitzien:
{
"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)"
}
}
Notitie
Het is belangrijk te weten dat alleen de Azure Functions v4-extensiebundel momenteel de benodigde ondersteuning heeft voor Durable Functions voor Java. Durable Functions voor Java wordt niet ondersteund in v3- en vroege uitbreidingsbundels. Zie de documentatie voor uitbreidingsbundels voor meer informatie over uitbreidingsbundels.
Durable Functions heeft een opslagprovider nodig om runtimestatus op te slaan. Voeg een local.settings.json
bestand toe aan uw projectmap om de opslagprovider te configureren. Als u Azure Storage als provider wilt gebruiken, stelt u de waarde in van AzureWebJobsStorage
het verbindingsreeks van uw Azure Storage-account:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
Uw functies maken
In de onderstaande voorbeeldcode ziet u een eenvoudig voorbeeld van elk voorbeeld:
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();
}
}
Een lokaal project maken met maven-opdracht
- Voer de volgende opdracht uit om een project te genereren met de basisfuncties van een Durable Functions-app:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DarchetypeVersion=1.51 -Dtrigger=durablefunctions
- Volg de aanwijzingen en geef de volgende informatie op:
Prompt | Waarde |
---|---|
groupId | com.function |
artifactId | myDurableFunction |
version | 1.0-SNAPSHOT |
package | com.function |
Y | Druk op Enter om te bevestigen |
U hebt nu een lokaal project gegenereerd met de drie functies die nodig zijn voor een eenvoudige Durable Functions-app.
Controleer of u een afhankelijkheid hebt com.microsoft:durabletask-azure-functions
in uw pom.xml
.
Back-endopslagprovider configureren
Durable Functions heeft een opslagprovider nodig om runtimestatus op te slaan. U kunt azure Storage als opslagprovider local.settings.json
configureren door de verbindingsreeks van uw Azure Storage-account op te geven als waarde voorAzureWebJobsStorage
:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<your storage account connection string>",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
Uw lokale project maken
Druk in Visual Studio Code op F1 (of Ctrl/Cmd+Shift+P) om het opdrachtenpalet te openen. In het opdrachtenpalet zoekt en selecteert u
Azure Functions: Create New Project...
.Kies een lege map voor uw project en kies Selecteren.
Volg de aanwijzingen en geef de volgende informatie op:
Prompt Waarde Een taal selecteren Kies Java
.Een versie van Java selecteren Kies Java 8
of nieuwer, de Java-versie waarop uw functies worden uitgevoerd in Azure. Kies een Java-versie die u lokaal hebt geverifieerd.Een groeps-id opgeven com.function
.Geef een artefact-id op myDurableFunction
.Geef een versie op 1.0-SNAPSHOT
.Geef een pakketnaam op com.function
.Geef een app-naam op myDurableFunction
.Het buildhulpprogramma voor een Java-project selecteren Kies Maven
.Selecteer hoe u uw project wilt openen Kies Open in new window
.
U hebt nu een project met een voorbeeld van een HTTP-functie. U kunt deze functie desgewenst verwijderen omdat we in de volgende stap de basisfuncties van een Durable Functions-app gaan toevoegen.
Functies toevoegen aan het project
In het opdrachtenpalet zoekt en selecteert u
Azure Functions: Create Function...
.Selecteer
Change template filter
deze optieAll
.Volg de aanwijzingen en geef de volgende informatie op:
Prompt Waarde Selecteer een sjabloon voor uw functie DurableFunctionsOrchestration Geef een pakketnaam op com.function
Geef een functienaam op DurableFunctionsOrchestrator
Kies
Select storage account
in het pop-upvenster waarin u wordt gevraagd om opslagaccountgegevens in te stellen en volg de aanwijzingen.
U hebt nu de drie basisfuncties voor een Durable Functions-app gegenereerd.
Pom.xml en host.json configureren
Voeg de volgende afhankelijkheid toe aan uw pom.xml
:
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>durabletask-azure-functions</artifactId>
<version>1.0.0</version>
</dependency>
Voeg de extensions
eigenschap toe aan het host.json
volgende:
"extensions": { "durableTask": { "hubName": "JavaTestHub" }}
De functie lokaal testen
Met Azure Functions Core-hulpprogramma's kunt u een Azure Functions-project uitvoeren op uw lokale ontwikkelcomputer.
Notitie
Durable Functions voor Java vereist Azure Functions Core Tools v4.0.4915 of hoger. U kunt zien welke versie is geïnstalleerd door de func --version
opdracht uit te voeren vanuit de terminal.
Als u Visual Studio Code gebruikt, opent u een nieuw terminalvenster en voert u de volgende opdrachten uit om het project te bouwen:
mvn clean package
Voer vervolgens de duurzame functie uit:
mvn azure-functions:run
Kopieer het URL-eindpunt van de door HTTP getriggerde functie in het deelvenster Terminal.
Verzend met behulp van een hulpprogramma zoals Postman of cURL een HTTP POST-aanvraag naar het URL-eindpunt. Als het goed is, krijgt u een antwoord dat er ongeveer als volgt uitziet:
{ "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==" }
De reactie is het eerste resultaat van de HTTP-functie dat u laat weten dat de duurzame indeling is gestart. Dit is nog niet het eindresultaat van de orchestrator. De reactie bevat enkele nuttige URL's. Maar eerst gaan we de status van de orchestrator opvragen.
Kopieer de URL-waarde voor
statusQueryGetUri
, plak deze in de adresbalk van de browser en voer de aanvraag uit. U kunt ook Postman of cURL blijven gebruiken om de GET-aanvraag uit te geven.De aanvraag voert een query uit op het orchestrator-exemplaar voor de status. U moet een eindige reactie krijgen, die laat zien dat het exemplaar is voltooid en die de uitvoer of resultaten van de Durable Function bevat. Deze ziet er als volgt uit:
{ "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" }