Share via


Uw Java-functie verbinden met Azure Storage

Met Azure Functions kunt u Azure-services en andere resource verbinden met services zonder dat u zelf integratiecode moet schrijven. Deze zogenaamde bindingen, die zowel invoer als uitvoer vertegenwoordigen, worden gedeclareerd binnen de functiedefinitie. Gegevens van bindingen worden als parameters doorgegeven aan de functie. Een trigger is een speciaal type invoerbinding. Hoewel een functie slechts één trigger heeft, kan deze meerdere invoer- en uitvoerbindingen hebben. Zie Azure Functions triggers and bindings concepts (Concepten van Azure Functions-triggers en -bindingen) voor meer informatie.

In dit artikel leest u hoe u de functie die u in het vorige quickstart-artikel hebt gemaakt, met een Azure Storage-wachtrij kunt integreren. De uitvoerbinding die u aan deze functie toevoegt, schrijft gegevens van een HTTP-aanvraag naar een bericht in de wachtrij.

Voor de meeste bindingen is een opgeslagen verbindingsreeks vereist die Functions gebruikt om toegang te krijgen tot de gebonden service. Om de verbinding makkelijker te kunnen maken, gebruikt u het Storage-account dat u voor uw functie-app hebt gemaakt. De verbinding met dit account is al opgeslagen in een app-instelling met de naam AzureWebJobsStorage.

Vereisten

Voordat u aan dit artikel begint, voert u de stappen in deel 1 van de Java-quickstart uit.

De instellingen voor functie-apps downloaden

U hebt al een functie-app in Azure gemaakt, in combinatie met het vereiste Storage-account. De verbindingsreeks voor dit account wordt veilig opgeslagen in de app-instellingen in Azure. In dit artikel schrijft u berichten naar een opslagwachtrij in hetzelfde account. Als u verbinding wilt maken met uw Storage-account wanneer u de functie lokaal uitvoert, moet u de app-instellingen downloaden naar het bestand local.settings.json.

Voer in de hoofdmap van het project de volgende Azure Functions Core Tools-opdracht uit om instellingen te downloaden naar local.settings.json, waarbij u <APP_NAME> vervangt door de naam van uw functie-app uit het vorige artikel:

func azure functionapp fetch-app-settings <APP_NAME>

Mogelijk moet u zich aanmelden bij uw Azure-account.

Belangrijk

Met deze opdracht worden alle bestaande instellingen overschreven met waarden uit uw functie-app in Azure.

Omdat het local.settings.json-bestand geheimen bevat, wordt het nooit gepubliceerd en dient het te worden uitgesloten van het broncodebeheer.

U hebt de waarde AzureWebJobsStorage nodig. Dit is de verbindingsreeks van het Storage-account. U gebruikt deze verbinding om te controleren of de uitvoerbinding werkt zoals verwacht.

Extensiebundels inschakelen

De eenvoudigste manier om bindingextensies te installeren, is door extensiebundelsin te schakelen. Wanneer u bundels inschakelt, wordt er automatisch een vooraf gedefinieerde set extensiepakketten geïnstalleerd.

Als u extensiebundels wilt inschakelen, opent u het bestand host.json en werkt u de inhoud daarvan zodanig bij dat deze overeenkomt met de volgende code:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[3.*, 4.0.0)"
    }
}

Nu kunt u de Storage-uitvoerbinding aan uw project toevoegen.

Een uitvoerbinding toevoegen

In een Java-project worden de bindingen gedefinieerd als bindingsaantekeningen in de functiemethode. Het bestand function.json wordt vervolgens automatisch gegenereerd op basis van deze aantekeningen.

Blader naar de locatie van de functiecode onder src/main/java, open het projectbestand Function.java en voeg de volgende parameter aan de methodedefinitie run toe:

@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg

De msg parameter is een OutputBinding<T> type, dat een verzameling tekenreeksen vertegenwoordigt. Deze tekenreeksen worden als berichten naar een uitvoerbinding geschreven wanneer de functie is voltooid. In dit geval is de uitvoer een opslagwachtrij met de naam outqueue. De verbindingsreeks voor het Storage-account wordt ingesteld door de methode connection. U geeft de toepassingsinstelling door die het opslagaccount bevat connection string, in plaats van de connection string zelf door te geven.

De run methodedefinitie moet er nu uitzien als in het volgende voorbeeld:

@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)  
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") 
        OutputBinding<String> msg, final ExecutionContext context) {
    ...
}

Code toevoegen die gebruikmaakt van de uitvoerbinding

U kunt nu de nieuwe parameter, msg, gebruiken om naar de uitvoerbinding van uw functiecode te schrijven. Voordat u het antwoord krijgt dat de bewerking is geslaagd, voegt u de volgende regel code toe om de waarde van name aan de msg-uitvoerbinding toe te voegen.

msg.setValue(name);

Als u een uitvoerbinding gebruikt, hoeft u niet de Azure Storage SDK-code voor verificatie te gebruiken, een wachtrijverwijzing op te halen of gegevens te schrijven. Deze taken worden voor u verwerkt via Functions-runtime en Queue Storage-uitvoerbinding.

Uw run methode moet er nu uitzien zoals in het volgende voorbeeld:

public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", 
        connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
        .body("Please pass a name on the query string or in the request body").build();
    } else {
        // Write the name to the message queue. 
        msg.setValue(name);

        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
}

De tests bijwerken

Omdat het archetype ook een reeks tests maakt, moet u deze tests bijwerken om de nieuwe parameter msg in de handtekening van methode run te verwerken.

Blader naar de locatie van uw testcode onder src/test/java, open het projectbestand Function.java en vervang de coderegel onder //Invoke door de volgende code:

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

U bent nu klaar om de nieuwe uitvoerbinding lokaal uit te proberen.

De functie lokaal uitvoeren

Gebruik net als voorheen de volgende opdracht om het project te bouwen en de Functions-runtime lokaal te starten:

mvn clean package 
mvn azure-functions:run

Notitie

Omdat u extensiebundels hebt ingeschakeld in de host.json, is de Opslagbindingsextensie tijdens het opstarten gedownload en geïnstalleerd, samen met de andere Microsoft-bindingsextensies.

Activeer net als voorheen de functie in een nieuw terminalvenster vanaf de opdrachtregel met de opdracht cURL:

curl -w "\n" http://localhost:7071/api/HttpTrigger-Java --data AzureFunctions

De uitvoerbinding maakt deze keer ook een wachtrij met de naam outqueue in uw Storage-account en voegt een bericht toe met dezelfde tekenreeks.

Vervolgens gebruikt u de Azure CLI om de nieuwe wachtrij te bekijken en te controleren of er een bericht is toegevoegd. U kunt uw wachtrij ook weergeven met behulp van Microsoft Azure Storage Explorer of in Azure Portal.

De Storage-accountverbinding instellen

Open het bestand local.settings.json en kopieer de waarde van AzureWebJobsStorage. Dit is de verbindingsreeks voor het Storage-account. Stel de AZURE_STORAGE_CONNECTION_STRING-omgevingsvariabele in op de verbindingsreeks met behulp van deze Bash-opdracht:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

Wanneer u de verbindingsreeks instelt in de AZURE_STORAGE_CONNECTION_STRING-omgevingsvariabele, hebt u toegang tot uw Storage-account zonder dat er steeds verificatie nodig is.

Een query uitvoeren op de opslagwachtrij

U kunt de opdracht az storage queue list gebruiken om de opslagwachtrijen in uw account te bekijken, zoals in het volgende voorbeeld:

az storage queue list --output tsv

De uitvoer van deze opdracht bevat een wachtrij met de naam outqueue. Dit is de wachtrij die is gemaakt toen de functie is uitgevoerd.

Gebruik hierna de opdracht az storage message peek om de berichten in deze wachtrij weer te geven, zoals in dit voorbeeld:

echo `echo $(az storage message peek --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`

De geretourneerde tekenreeks moet hetzelfde zijn als het bericht dat u hebt verzonden om de functie te testen.

Notitie

In het vorige voorbeeld wordt de geretourneerde tekenreeks gedecodeerd vanuit Base 64. Dit gebeurt omdat bindingen naar/van de opslagwachtrij als Base 64-tekenreeksen naar Azure Storage worden geschreven/gelezen.

Het project opnieuw implementeren

Voer de volgende opdracht opnieuw uit om de gepubliceerde app bij te werken:

mvn azure-functions:deploy

U kunt ook cURL gebruiken om de geïmplementeerde functie te testen. Geef net als voorheen de waarde AzureFunctions in de hoofdtekst van de POST-aanvraag naar de URL door, zoals in dit voorbeeld:

curl -w "\n" https://fabrikam-functions-20190929094703749.azurewebsites.net/api/HttpTrigger-Java?code=zYRohsTwBlZ68YF.... --data AzureFunctions

Bekijk het bericht in Storage Queue opnieuw om te controleren of de uitvoerbinding zoals verwacht een nieuw bericht in de wachtrij genereert.

Resources opschonen

Andere Quick Starts in deze verzameling zijn op deze Quick Start gebaseerd. Als u van plan bent om door te gaan met volgende quickstarts of met de zelfstudies, verwijdert u de resources die u in deze quickstart hebt gemaakt niet. Als u niet wilt doorgaan, gebruikt u de volgende opdracht om alle resources te verwijderen die via deze quickstart zijn gemaakt:

az group delete --name myResourceGroup

Selecteer y wanneer u hierom wordt gevraagd.

Volgende stappen

U hebt uw HTTP-geactiveerde functie bijgewerkt om gegevens naar een Storage-wachtrij te schrijven. Zie de Azure Functions Java-ontwikkelaarshandleiding en Azure Functions-triggers en -bindingen voor meer informatie over het ontwikkelen van Azure Functions met Java. Zie de voorbeelden van Java-functies voor voorbeelden van complete functieprojecten in Java.

Vervolgens moet u bewaking met Application Insights inschakelen voor uw functie-app: