Connettere la funzione Java ad archiviazione di Azure

La soluzione Funzioni di Azure consente di connettere i servizi di Azure e altre risorse alle funzioni senza la necessità di scrivere codice di integrazione personalizzato. Questi binding, che rappresentano sia input che output, vengono dichiarati all'interno della definizione di funzione. I dati dei binding vengono forniti alla funzione come parametri. Un trigger è un tipo speciale di binding di input. Anche se una funzione include un solo trigger, può avere più binding di input e output. Per altre informazioni, vedere Concetti su trigger e binding di Funzioni di Azure.

Questo articolo illustra come integrare la funzione creata nel precedente articolo di avvio rapido con una coda di archiviazione di Azure. Il binding di output che si aggiunge a questa funzione scrive i dati di una richiesta HTTP in un messaggio della coda.

La maggior parte dei binding richiede una stringa di connessione archiviata che verrà usata da Funzioni per accedere al servizio associato. Per semplificare questa connessione, usare l'account di archiviazione creato con l'app per le funzioni. La connessione a questo account è già archiviata in un'impostazione dell'app denominata AzureWebJobsStorage.

Prerequisiti

Prima di iniziare con questo articolo, completare i passaggi della parte 1 dell'argomento di avvio rapido su Java.

Scaricare le impostazioni dell'app per le funzioni

È stata già creata un'app per le funzioni in Azure, oltre al necessario account di archiviazione. La stringa di connessione per questo account è archiviata in modo sicuro nelle impostazioni dell'app in Azure. In questo articolo verranno scritti messaggi in una coda di archiviazione dello stesso account. Per connettersi all'account di archiviazione durante l'esecuzione della funzione in locale, è necessario scaricare le impostazioni dell'app nel file local.settings.json.

Dalla radice del progetto eseguire il comando di Azure Functions Core Tools seguente per scaricare le impostazioni nel file local.settings.json, sostituendo <APP_NAME> con il nome dell'app per le funzioni specificato nell'articolo precedente:

func azure functionapp fetch-app-settings <APP_NAME>

Potrebbe essere necessario accedere all'account Azure.

Importante

Questo comando sovrascrive le impostazioni esistenti con i valori dell'app per le funzioni in Azure.

Il file local.settings.json contiene segreti, quindi non viene mai pubblicato e dovrà essere escluso dal controllo del codice sorgente.

È necessario il valore AzureWebJobsStorage, che corrisponde alla stringa di connessione dell'account di archiviazione. Usare questa connessione per verificare se il binding di output funziona come previsto.

Abilitare le aggregazioni di estensioni

Il modo più semplice per installare le estensioni di binding è consentire aggregazioni di estensione. Quando si abilitano i bundle, viene installato automaticamente un set predefinito di pacchetti di estensioni.

Per abilitare i bundle di estensioni, aprire il file host.json e aggiornarne il contenuto in modo che corrisponda al codice seguente:

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

È ora possibile aggiungere il binding di output di archiviazione nel progetto.

Aggiungere un binding di output

In un progetto Java i binding vengono definiti come annotazioni di binding nel metodo della funzione. Il file function.json viene quindi generato automaticamente in base a queste annotazioni.

Passare al percorso del codice della funzione, src/main/java, aprire il file di progetto Function.java e aggiungere il parametro seguente alla definizione del metodo run:

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

Il msg parametro è un OutputBinding<T> tipo, che rappresenta una raccolta di stringhe. Queste stringhe vengono scritte come messaggi in un'associazione di output al termine della funzione. In questo caso, l'output è una coda di archiviazione denominata outqueue. La stringa di connessione per l'account di archiviazione è impostata dal metodo connection. Si passa l'impostazione dell'applicazione contenente la stringa di connessione dell'account di archiviazione anziché passare la stringa di connessione stessa.

La definizione del run metodo deve ora essere simile all'esempio seguente:

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

Aggiungere il codice che usa l'associazione di output

Ora è possibile usare il nuovo parametro msg per scrivere nel binding di output dal codice della funzione. Aggiungere la riga di codice seguente prima della risposta di operazione riuscita per aggiungere il valore di name al binding di output msg.

msg.setValue(name);

Quando si usa un binding di output, non è necessario usare il codice di Azure Storage SDK per l'autenticazione, per recuperare un riferimento alla coda o per scrivere dati. Queste attività vengono eseguite automaticamente dal runtime di Funzioni e dal binding di output.

Il run metodo deve ora essere simile all'esempio seguente:

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

Aggiornare i test

Poiché l'archetipo crea anche un set di test, è necessario aggiornare questi test per gestire il nuovo parametro msg nella firma del metodo run.

Passare al percorso del codice di test in src/test/java, aprire il file di progetto Function.java e sostituire la riga di codice in //Invoke con il codice seguente:

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

È ora possibile provare il nuovo binding di output in locale.

Eseguire la funzione in locale

Come prima, usare il comando seguente per creare il progetto e avviare il runtime di Funzioni in locale:

mvn clean package 
mvn azure-functions:run

Nota

Poiché sono stati abilitati i bundle di estensioni nel file host.json, durante l'avvio è stata scaricata e configurata l'estensione di binding di archiviazione, nonché altre estensioni di binding di Microsoft.

Come prima, attivare la funzione dalla riga di comando usando cURL in una nuova finestra del terminale:

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

Questa volta il binding di output crea anche una coda denominata outqueue nell'account di archiviazione e aggiunge un messaggio con questa stessa stringa.

Quindi, usare l'interfaccia della riga di comando di Azure per visualizzare la nuova coda e verificare che è stato aggiunto un messaggio. È anche possibile visualizzare la coda usando Microsoft Azure Storage Explorer oppure nel portale di Azure.

Impostare la connessione dell'account di archiviazione

Aprire il file local.settings.json e copiare il valore di AzureWebJobsStorage, che corrisponde alla stringa di connessione dell'account di archiviazione. Impostare la variabile di ambiente AZURE_STORAGE_CONNECTION_STRING sulla stringa di connessione usando il comando Bash seguente:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

Con la stringa di connessione impostata sulla variabile di ambiente AZURE_STORAGE_CONNECTION_STRING, è possibile accedere all'account di archiviazione senza eseguire ogni volta l'autenticazione.

Eseguire una query sulla coda di archiviazione

È possibile usare il comando az storage queue list per visualizzare le code di archiviazione dell'account, come indicato nell'esempio seguente:

az storage queue list --output tsv

L'output di questo comando include una coda denominata outqueue, che è la coda creata quando è stata eseguita la funzione.

Usare quindi il comando az storage message peek per visualizzare i messaggi inclusi in questa coda, come indicato in questo esempio:

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

La stringa restituita dovrebbe essere la stessa del messaggio inviato per testare la funzione.

Nota

L'esempio precedente decodifica la stringa restituita da base64. Il motivo è che i binding di archiviazione della coda scrivono e leggono i dati da Archiviazione di Azure sotto forma di stringhe base64.

Ridistribuire il progetto

Per aggiornare l'app pubblicata, eseguire di nuovo il comando seguente:

mvn azure-functions:deploy

Anche in questo caso, è possibile usare cURL per testare la funzione distribuita. Come prima, passare il valore AzureFunctions nel corpo della richiesta POST all'URL, come indicato in questo esempio:

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

È possibile esaminare di nuovo il messaggio della coda di archiviazione per verificare che il binding di output genera un nuovo messaggio nella coda, come previsto.

Pulire le risorse

Altre guide di avvio rapido di questa raccolta si basano sulla presente guida di avvio rapido. Se si prevede di continuare con le guide di avvio rapido o le esercitazioni successive, non eliminare le risorse create in questa guida di avvio rapido. Se non si prevede di continuare, usare il comando seguente per eliminare tutte le risorse create in questa guida di avvio rapido:

az group delete --name myResourceGroup

Quando richiesto, selezionare y.

Passaggi successivi

La funzione di trigger HTTP è stata aggiornata per scrivere dati in una coda di archiviazione. Per altre informazioni sullo sviluppo di Funzioni di Azure con Java, vedere Guida per sviluppatori Java per Funzioni di Azure e Trigger e binding di Funzioni di Azure. Per alcuni esempi di progetti di Funzioni completi in Java, vedere gli esempi di funzioni Java.

Quindi, è consigliabile abilitare il monitoraggio di Application Insights per l'app per le funzioni: