Compartilhar via


Conectar a função Java ao Armazenamento do Azure

O Azure Functions lhe permite conectar os serviços do Azure e outros recursos às funções sem precisar escrever seu próprio código de integração. Essas associações, que representam a entrada e a saída, são declaradas na definição de função. Dados de associações são fornecidos à função como parâmetros. Um gatilho é um tipo especial de associação de entrada. Embora uma função tenha apenas um gatilho, ela pode ter várias associações de entrada e de saída. Para saber mais, confira Conceitos de gatilhos e de associações do Azure Functions.

Este artigo mostra como integrar a função criada no artigo de início rápido anterior com uma fila de Armazenamento do Azure. A associação de saída que você adiciona a essa função escreve dados de uma solicitação HTTP em uma mensagem na fila.

A maioria das associações requer uma cadeia de conexão armazenada que o Functions usa para acessar o serviço vinculado. Para facilitar essa conexão, use a conta de armazenamento que você criou com o seu aplicativo de funções. A conexão com essa conta já está armazenada em uma configuração de aplicativo chamada AzureWebJobsStorage.

Pré-requisitos

Antes de iniciar este artigo, conclua as etapas na parte 1 do início rápido do Java.

Baixar as configurações do aplicativo de funções

Você já criou um aplicativo de funções no Azure, juntamente com a conta de armazenamento necessária. A cadeia de conexão dessa conta é armazenada com segurança nas configurações do aplicativo no Azure. Neste artigo, você escreverá mensagens em uma Fila de armazenamento na mesma conta. Para se conectar à sua Conta de armazenamento ao executar a função localmente, é necessário baixar as configurações do aplicativo para o arquivo local.settings.json.

Na raiz do projeto, execute o seguinte comando do Azure Functions Core Tools para baixar as configurações em local.settings.json, substituindo <APP_NAME> pelo nome do aplicativo de funções do artigo anterior:

func azure functionapp fetch-app-settings <APP_NAME>

Talvez você precise entrar em sua conta do Azure.

Importante

Esse comando substitui todas as configurações existentes por valores do aplicativo de funções no Azure.

Como ela contém segredos, o arquivo local.settings.json nunca é publicado e deve ser excluído do controle do código-fonte.

É necessário ter o valor AzureWebJobsStorage, que é a cadeia de conexão da Conta de armazenamento. Use esta conexão para verificar se a associação de saída funciona conforme o esperado.

Habilitar pacotes de extensão

A maneira mais fácil de instalar as extensões de associação é habilitar pacotes de extensão. Quando você habilita os pacotes, um conjunto predefinido de pacotes de extensão é instalado automaticamente.

Para habilitar pacotes de extensão, abra o arquivo host.json e atualize seu conteúdo de acordo com o código a seguir:

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

Agora, você pode adicionar a associação de saída do Armazenamento ao seu projeto.

Adicionar uma associação de saída

Em um projeto Java, as associações são definidas como anotações de associação no método de função. O arquivo function.json é então gerado automaticamente com base nessas anotações.

Procure a localização do código de função em src/main/java, abra o arquivo de projeto Function.java e adicione o seguinte parâmetro à definição do método run:

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

O parâmetro msg é um tipo OutputBinding<T>, que representa uma coleção de cadeias de caracteres. Essas cadeias de caracteres são gravadas como mensagens em uma associação de saída quando a função é concluída. Nesse caso, a saída é uma fila de armazenamento denominada outqueue. A cadeia de conexão para a conta de armazenamento é definida pelo método connection. Passe a configuração de aplicativo que contém a cadeia de conexão da conta de armazenamento, em vez de passar a própria cadeia de conexão.

A definição do método run agora deverá ser semelhante ao seguinte exemplo:

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

Adicionar o código que usa a associação de saída

Agora, você pode usar o novo parâmetro msg para fazer a gravação na associação de saída por meio do código de função. Adicione a linha de código a seguir antes da resposta de êxito para adicionar o valor de name à associação de saída msg.

msg.setValue(name);

Ao usar uma associação de saída, não é necessário usar o código do SDK do Armazenamento do Azure para se autenticar, para obter uma referência de fila ou para escrever dados. O runtime do Functions e a associação de saída da fila fazem essas tarefas para você.

O método run agora deverá ser semelhante ao seguinte exemplo:

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

Atualizar os testes

Como o arquétipo também cria um conjunto de testes, você precisa atualizar esses testes para manipular o novo parâmetro msg na assinatura do método run.

Procure a localização do código de teste em src/test/java, abra o arquivo de projeto Function.java e substitua a linha de código em //Invoke pelo código a seguir:

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

Agora você está pronto para experimentar a nova associação de saída localmente.

Executar a função localmente

Como anteriormente, use o seguinte comando para compilar o projeto e iniciar o Functions Runtime localmente:

mvn clean package 
mvn azure-functions:run

Observação

Como você habilitou os pacotes de extensões no host.json, a extensão de associação do armazenamento foi baixada e instalada para você durante a inicialização, juntamente com outras extensões de associação da Microsoft.

Como anteriormente, dispare a função na linha de comando usando o cURL em uma nova janela de terminal:

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

Dessa vez, a associação de saída também cria uma fila denominada outqueue em sua Conta de armazenamento e adiciona uma mensagem com essa mesma cadeia de caracteres.

Em seguida, use a CLI do Azure para exibir a nova fila e verifique se uma mensagem foi adicionada. Também é possível exibir sua fila usando o Gerenciador de Armazenamento do Microsoft Azure ou no portal do Azure.

Definir a conexão da Conta de armazenamento

Abra o arquivo local.settings.json e copie o valor de AzureWebJobsStorage, que é a cadeia de conexão da Conta de armazenamento. Defina a variável de ambiente AZURE_STORAGE_CONNECTION_STRING como a cadeia de conexão usando o seguinte comando do Bash:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

Quando você definir a cadeia de conexão na variável de ambiente AZURE_STORAGE_CONNECTION_STRING, é possível acessar a conta de Armazenamento sem ter que fornecer a autenticação toda vez.

Consultar a Fila de armazenamento

É possível usar o comando az storage queue list para exibir as Filas de armazenamento em sua conta, como no exemplo a seguir:

az storage queue list --output tsv

A saída desse comando inclui uma fila denominada outqueue, que é a fila que foi criada quando a função foi executada.

Em seguida, use o comando az storage message peek para exibir as mensagens nessa fila, como no exemplo a seguir:

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

A cadeia de caracteres retornada deve ser a mesma que a mensagem enviada para testar a função.

Observação

O exemplo anterior decodifica a cadeia de caracteres retornada de base64. Isso ocorre porque as associações de Armazenamento de fila gravam e leem do Armazenamento do Azure como cadeias de caracteres base64.

Reimplantar o projeto

Para atualizar o aplicativo publicado, execute o seguinte comando novamente:

mvn azure-functions:deploy

Novamente, use o cURL para testar a função implantada. Como anteriormente, passe o valor AzureFunctions no corpo da solicitação POST para a URL, como neste exemplo:

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

Examine a mensagem da Fila de armazenamento novamente para verificar se a associação de saída gera uma nova mensagem na fila, conforme esperado.

Limpar os recursos

Outros inícios rápidos nessa coleção aproveitam esse início rápido. Se você planeja continuar com Inícios Rápidos ou tutoriais subsequentes, não limpe os recursos criados neste Início Rápido. Se você não planeja continuar, use o comando a seguir para excluir todos os recursos criados neste Início Rápido:

az group delete --name myResourceGroup

Quando solicitado, selecione y.

Próximas etapas

Você atualizou a função disparada por HTTP para gravar dados em uma fila de armazenamento. Para saber mais sobre como desenvolver o Azure Functions com o Java, confira o Guia do desenvolvedor de Java para o Azure Functions e Gatilhos e associações do Azure Functions. Para obter exemplos de projetos completos de funções em Java, confira as Amostras de funções Java.

Em seguida, você deve habilitar o monitoramento do Application Insights para seu aplicativo de funções: