Ansluta din Java-funktion till Azure Storage

Azure Functions kan du ansluta Azure-tjänster och andra resurser till funktioner utan att behöva skriva din egen integreringskod. Dessa bindningar, som representerar både indata och utdata, deklareras i funktionsdefinitionen. Data från bindningar skickas som parametrar till funktionen. En utlösare är en särskild typ av indatabindning. Även om en funktion bara har en utlösare kan den ha flera indata- och utdatabindningar. Mer information finns i Azure Functions utlösare och bindningar.

Den här artikeln visar hur du integrerar funktionen som du skapade i föregående snabbstartsartikel med en Azure Storage-kö. Den utdatabindning som du lägger till i den här funktionen skriver data från en HTTP-begäran till ett meddelande i kön.

De flesta bindningar kräver en lagrad anslutningssträng som Functions använder för att komma åt den bundna tjänsten. För att göra den här anslutningen enklare använder du lagringskontot som du skapade med funktionsappen. Anslutningen till det här kontot lagras redan i en appinställning med namnet AzureWebJobsStorage.

Förutsättningar

Innan du börjar med den här artikeln slutför du stegen i del 1 av Java-snabbstarten.

Ladda ned inställningarna för funktionsappen

Du har redan skapat en funktionsapp i Azure, tillsammans med det lagringskonto som krävs. Anslutningssträngen för det här kontot lagras på ett säkert sätt i appinställningarna i Azure. I den här artikeln skriver du meddelanden till en lagringskö i samma konto. Om du vill ansluta till lagringskontot när du kör funktionen lokalt måste du ladda ned appinställningarna till filen local.settings.json.

Från roten av projektet kör du följande kommando Azure Functions Core Tools för att ladda ned inställningar till local.settings.json och ersätta <APP_NAME> med namnet på din funktionsapp från föregående artikel:

func azure functionapp fetch-app-settings <APP_NAME>

Du kan behöva logga in på ditt Azure-konto.

Viktigt

Det här kommandot skriver över alla befintliga inställningar med värden från funktionsappen i Azure.

Eftersom den innehåller hemligheter publiceras aldrig filen local.settings.json, och den bör undantas från källkontrollen.

Du behöver värdet AzureWebJobsStorage, som är anslutningssträngen för lagringskontot. Du använder den här anslutningen för att kontrollera att utdatabindningen fungerar som förväntat.

Aktivera tilläggspaket

Det enklaste sättet att installera bindningstillägg är att aktivera tilläggspaket. När du aktiverar paket installeras automatiskt en fördefinierad uppsättning tilläggspaket.

Om du vill aktivera tilläggspaket öppnar du filen host.json och uppdaterar dess innehåll så att det matchar följande kod:

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

Nu kan du lägga till storage-utdatabindningen i projektet.

Lägg till en utdatabindning

I ett Java-projekt definieras bindningarna som bindningsanteckningar för funktionsmetoden. Filen function.json genereras sedan automatiskt baserat på dessa anteckningar.

Bläddra till platsen för funktionskoden under src/main/java, öppna projektfilen Function.java och lägg till följande parameter i metoddefinitionen run :

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

Parametern msg är en OutputBinding<T> typ som representerar en samling strängar. Dessa strängar skrivs som meddelanden till en utdatabindning när funktionen har slutförts. I det här fallet är utdata en lagringskö med namnet outqueue. Anslutningssträngen för lagringskontot anges med connection metoden . Du skickar programinställningen som innehåller anslutningssträngen för lagringskontot i stället för att skicka själva anslutningssträngen.

Metoddefinitionen run måste nu se ut som i följande exempel:

@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) {
    ...
}

Lägg till kod som använder utdatabindning

Nu kan du använda den nya msg parametern för att skriva till utdatabindningen från funktionskoden. Lägg till följande kodrad före lyckat svar för att lägga till värdet name för i utdatabindningen msg .

msg.setValue(name);

När du använder en utdatabindning behöver du inte använda Azure Storage SDK-koden för autentisering, hämta en köreferens eller skriva data. Functions-körnings- och köutdatabindningen utför dessa uppgifter åt dig.

Din run metod måste nu se ut som i följande exempel:

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

Uppdatera testerna

Eftersom arketypen också skapar en uppsättning tester måste du uppdatera dessa tester för att hantera den nya msg parametern i metodsignaturen run .

Bläddra till platsen för testkoden under src/test/java, öppna projektfilen Function.java och ersätt kodraden under //Invoke med följande kod:

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

Nu är du redo att prova den nya utdatabindningen lokalt.

Köra funktionen lokalt

Som tidigare använder du följande kommando för att skapa projektet och starta Functions-körningen lokalt:

mvn clean package 
mvn azure-functions:run

Anteckning

Eftersom du har aktiverat tilläggspaket i host.json laddades storage-bindningstillägget ned och installerades åt dig under starten, tillsammans med de andra Microsoft-bindningstilläggen.

Som tidigare utlöser du funktionen från kommandoraden med cURL i ett nytt terminalfönster:

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

Den här gången skapar utdatabindningen även en kö med namnet outqueue i lagringskontot och lägger till ett meddelande med samma sträng.

Sedan använder du Azure CLI för att visa den nya kön och verifiera att ett meddelande har lagts till. Du kan också visa kön med hjälp av Microsoft Azure Storage Explorer eller i Azure Portal.

Ange anslutningen till lagringskontot

Öppna filen local.settings.json och kopiera värdet AzureWebJobsStorageför , som är anslutningssträngen för lagringskontot. AZURE_STORAGE_CONNECTION_STRING Ställ in miljövariabeln på anslutningssträngen med hjälp av det här Bash-kommandot:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

När du anger anslutningssträngen AZURE_STORAGE_CONNECTION_STRING i miljövariabeln kan du komma åt lagringskontot utan att behöva ange autentisering varje gång.

Fråga Storage-kön

Du kan använda az storage queue list kommandot för att visa Lagringsköer i ditt konto, som i följande exempel:

az storage queue list --output tsv

Utdata från det här kommandot innehåller en kö med namnet outqueue, som är den kö som skapades när funktionen kördes.

az storage message peek Använd sedan kommandot för att visa meddelandena i den här kön, som i det här exemplet:

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

Strängen som returneras ska vara samma som det meddelande som du skickade för att testa funktionen.

Anteckning

I föregående exempel avkodas den returnerade strängen från base64. Det beror på att Queue Storage-bindningarna skriver till och läser från Azure Storage som base64-strängar.

Distribuera om projektet

Om du vill uppdatera den publicerade appen kör du följande kommando igen:

mvn azure-functions:deploy

Återigen kan du använda cURL för att testa den distribuerade funktionen. Som tidigare skickar du värdet AzureFunctions i brödtexten i POST-begäran till URL:en, som i det här exemplet:

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

Du kan granska Storage-kömeddelandet igen för att kontrollera att utdatabindningen genererar ett nytt meddelande i kön som förväntat.

Rensa resurser

De andra snabbstarterna i den här samlingen bygger på den här snabbstarten. Om du planerar att fortsätta med efterföljande snabbstarter eller med självstudierna ska du inte rensa resurserna som skapades i den här snabbstarten. Om du inte planerar att fortsätta använder du följande kommando för att ta bort alla resurser som skapats i den här snabbstarten:

az group delete --name myResourceGroup

Välj y när du uppmanas till det.

Nästa steg

Du har uppdaterat din HTTP-utlösta funktion för att skriva data till en Lagringskö. Mer information om hur du utvecklar Azure Functions med Java finns i utvecklarguiden för Azure Functions Java och Azure Functions utlösare och bindningar. Exempel på fullständiga funktionsprojekt i Java finns i Java Functions-exemplen.

Därefter bör du aktivera Application Insights-övervakning för din funktionsapp: