Herstellen einer Verbindung zwischen Ihrer Java-Funktion und Azure Storage

Azure Functions gestattet Ihnen das Verbinden von Azure-Diensten und anderen Ressourcen mit Funktionen, ohne dass Sie Ihren eigenen Integrationscode schreiben müssen. Diese Bindungen, die sowohl Eingabe als auch Ausgabe darstellen, werden innerhalb der Funktionsdefinition deklariert. Daten von Bindungen werden der Funktion als Parameter bereitgestellt. Ein Trigger ist ein spezieller Typ von Eingabebindung. Eine Funktion hat zwar nur einen Trigger, kann aber mehrere Ein- und Ausgabebindungen haben. Weitere Informationen finden Sie unter Konzepte der Trigger und Bindungen in Azure Functions.

In diesem Artikel erfahren Sie, wie Sie die Funktion, die Sie im vorherigen Schnellstartartikel erstellt haben, mit einer Azure Storage-Warteschlange integrieren. Die Ausgabebindung, die Sie dieser Funktion hinzufügen, schreibt Daten aus einer HTTP-Anforderung in eine Nachricht in der Warteschlange.

Die meisten Bindungen erfordern eine gespeicherte Verbindungszeichenfolge, die Functions verwendet, um auf den gebundenen Dienst zuzugreifen. Um diese Verbindung zu vereinfachen, verwenden Sie das Storage-Konto, das Sie mit Ihrer Funktions-App erstellt haben. Die Verbindung mit diesem Konto ist bereits in einer App-Einstellung namens AzureWebJobsStorage gespeichert.

Voraussetzungen

Führen Sie die Schritte in Teil 1 der Java-Schnellstartanleitung aus, bevor Sie mit diesem Artikel beginnen.

Herunterladen der Funktions-App-Einstellungen

Sie haben bereits eine Funktions-App in Azure zusammen mit dem erforderlichen Storage-Konto erstellt. Die Verbindungszeichenfolge für dieses Konto wird sicher in App-Einstellungen in Azure gespeichert. In diesem Artikel schreiben Sie Nachrichten in eine Speicherwarteschlange in demselben Konto. Um eine Verbindung mit Ihrem Speicherkonto herzustellen, wenn die Funktion lokal ausgeführt wird, müssen Sie App-Einstellungen in die Datei „local.settings.json“ herunterladen.

Führen Sie im Stammverzeichnis des Projekts den folgenden Azure Functions Core Tools-Befehl aus, um Einstellungen in „local.settings.json“ herunterzuladen, und ersetzen Sie dabei <APP_NAME> durch den Namen Ihrer Funktions-App aus dem vorherigen Artikel:

func azure functionapp fetch-app-settings <APP_NAME>

Möglicherweise müssen Sie sich bei Ihrem Azure-Konto anmelden.

Wichtig

Dieser Befehl überschreibt alle vorhandenen Einstellungen mit Werten aus ihrer Funktions-App in Azure.

Da sie Geheimnisse enthält, wird die lokale Datei „local.settings.json“ nie veröffentlicht, und sie sollte auch aus der Quellcodeverwaltung ausgeschlossen werden.

Sie benötigen den Wert AzureWebJobsStorage, bei dem es sich um die Verbindungszeichenfolge des Speicherkontos handelt. Sie verwenden diese Verbindung, um sicherzustellen, dass die Ausgabebindung wie erwartet funktioniert.

Aktivieren von Erweiterungsbundles

Der einfachste Weg, Bindungserweiterungen zu installieren, ist die Aktivierung von Erweiterungspaketen. Wenn Sie Pakete aktivieren, wird automatisch ein vordefinierter Satz von Erweiterungspaketen installiert.

Um Erweiterungspakete zu aktivieren, öffnen Sie die Datei „host.json“, und aktualisieren Sie ihren Inhalt entsprechend dem folgenden Code:

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

Jetzt können Sie dem Projekt die Storage-Ausgabebindung hinzufügen.

Hinzufügen einer Ausgabebindung

In einem Java-Projekt werden die Bindungen als Bindungsanmerkungen für die Funktionsmethode definiert. Die Datei function.json wird dann automatisch auf der Grundlage dieser Anmerkungen generiert.

Navigieren Sie zum Speicherort Ihres Funktionscodes (unter src/main/java), öffnen Sie die Projektdatei Function.java, und fügen Sie der Definition der Methode run die folgenden Parameter hinzu:

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

Der msg-Parameter weist den Typ OutputBinding<T> auf, der eine Sammlung von Zeichenfolgen darstellt. Diese Zeichenfolgen werden als Nachrichten in eine Ausgabebindung geschrieben, wenn die Funktion abgeschlossen wird. In diesem Fall ist die Ausgabe eine Speicherwarteschlange mit dem Namen outqueue. Die Verbindungszeichenfolge für das Storage-Konto wird durch die Methode connection festgelegt. Anstelle der eigentlichen Verbindungszeichenfolge übergeben Sie die Anwendungseinstellung, die die Verbindungszeichenfolge für das Storage-Konto enthält.

Die Definition der Methode run muss nun wie im folgenden Beispiel aussehen:

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

Hinzufügen von Code, der die Ausgabebindung verwendet

Nun können Sie den neuen Parameter msg verwenden, um von Ihrem Funktionscode aus in die Ausgabebindung zu schreiben. Fügen Sie vor der Erfolgsantwort die folgende Codezeile hinzu, um der Ausgabebindung msg den Wert name hinzuzufügen:

msg.setValue(name);

Bei Verwendung einer Ausgabebindung müssen Sie weder den Azure Storage SDK-Code für die Authentifizierung verwenden noch einen Warteschlangenverweis abrufen oder Daten schreiben. Die Functions-Runtime und die Warteschlangenausgabebindung übernehmen diese Aufgaben für Sie.

Die Methode run muss nun wie im folgenden Beispiel aussehen:

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

Aktualisieren der Tests

Da der Archetyp auch eine Reihe von Tests erstellt, müssen Sie diese Tests aktualisieren, um den neuen Parameter msg in der Signatur der Methode run zu behandeln.

Navigieren Sie zum Speicherort Ihres Testcodes unter src/test/java, öffnen Sie die Projektdatei Function.java, und ersetzen Sie die Codezeile unter //Invoke durch den folgenden Code:

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

Nun können Sie die neue Ausgabebindung lokal testen.

Lokales Ausführen der Funktion

Verwenden Sie wie zuvor den folgenden Befehl, um das Projekt zu erstellen und die Functions-Runtime lokal zu starten:

mvn clean package 
mvn azure-functions:run

Hinweis

Da Sie Erweiterungsbündel in der Datei „host.json“ aktiviert haben, wurde die Storage-Bindungserweiterung zusammen mit den übrigen Microsoft-Bindungserweiterungen während des Starts für Sie heruntergeladen und installiert.

Lösen Sie die Funktion wie zuvor über die Befehlszeile aus. Verwenden Sie dazu cURL in einem neuen Terminalfenster:

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

Diesmal erstellt die Ausgabebindung außerdem eine Warteschlange namens outqueue in Ihrem Speicherkonto und fügt eine Nachricht mit dieser selben Zeichenfolge hinzu.

Als Nächstes verwenden Sie die Azure CLI, um die neue Warteschlange anzuzeigen und sicherzustellen, dass eine Nachricht hinzugefügt wurde. Sie können Ihre Warteschlange auch mithilfe des Microsoft Azure Storage-Explorers oder im Azure-Portal anzeigen.

Festlegen der Speicherkontoverbindung

Öffnen Sie die Datei „local.settings.json“, und kopieren Sie den Wert von AzureWebJobsStorage, wobei es sich um die Verbindungszeichenfolge des Speicherkontos handelt. Legen Sie die Umgebungsvariable AZURE_STORAGE_CONNECTION_STRING mit dem folgenden Bash-Befehl auf die Verbindungszeichenfolge fest:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

Wenn Sie die Verbindungszeichenfolge in der Umgebungsvariablen AZURE_STORAGE_CONNECTION_STRING festlegen, können Sie auf Ihr Speicherkonto zugreifen, ohne sich jedes Mal authentifizieren zu müssen.

Abfragen der Speicherwarteschlange

Sie können den Befehl az storage queue list verwenden, um die Speicherwarteschlangen in Ihrem Konto anzuzeigen, wie im folgenden Beispiel gezeigt:

az storage queue list --output tsv

Die Ausgabe dieses Befehls umfasst eine Warteschlange namens outqueue, wobei es sich um die Warteschlange handelt, die bei Ausführung der Funktion erstellt wurde.

Als Nächstes verwenden Sie den Befehl az storage message peek, um die Nachrichten in dieser Warteschlange anzuzeigen, wie im folgenden Beispiel zu sehen:

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

Die zurückgegebene Zeichenfolge sollte mit der Nachricht, die Sie zum Testen der Funktion gesendet haben, identisch sein.

Hinweis

Im vorherigen Beispiel wird die zurückgegebene Zeichenfolge aus base64 decodiert. Der Grund hierfür ist, dass die Warteschlangenspeicherbindungen als base64-Zeichenfolgen in Azure Storage geschrieben und daraus gelesen werden.

Erneutes Bereitstellen des Projekts

Führen Sie zum Aktualisieren Ihrer veröffentlichten App den folgenden Befehl erneut aus:

mvn azure-functions:deploy

Sie können auch wieder cURL verwenden, um die bereitgestellte Funktion zu testen. Übergeben Sie wie zuvor den Wert AzureFunctions im Text der POST-Anforderung an die URL. Beispiel:

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

Sie können die Storage-Warteschlangennachricht erneut untersuchen, um zu überprüfen, ob die Ausgabebindung wie erwartet eine neue Nachricht in der Warteschlange generiert.

Bereinigen von Ressourcen

Andere Schnellstarts in dieser Sammlung bauen auf diesem Schnellstart auf. Wenn Sie planen, mit den nachfolgenden Schnellstarts oder Tutorials fortzufahren, sollten Sie die in diesem Schnellstart erstellten Ressourcen nicht bereinigen. Falls Sie nicht fortfahren möchten, können Sie den folgenden Befehl ausführen, um alle in dieser Schnellstartanleitung erstellten Ressourcen zu löschen:

az group delete --name myResourceGroup

Wählen Sie y, wenn Sie dazu aufgefordert werden.

Nächste Schritte

Sie haben Ihre mittels HTTP ausgelöste Funktion so aktualisiert, dass sie Daten in eine Storage-Warteschlange schreibt. Weitere Informationen zum Entwickeln von Azure-Funktionen mit Java finden Sie im Java-Entwicklerhandbuch für Azure Functions sowie unter Azure Functions-Trigger und -Bindungen. Beispiele für vollständige Funktionsprojekte in Java finden Sie in den Functions-Beispielen für Java.

Als Nächstes sollten Sie die Application Insights-Überwachung für Ihre Funktions-App aktivieren: