Usar o Java para enviar eventos ou receber eventos dos Hubs de Eventos do Azure (azure-messaging-eventhubs)Use Java to send events to or receive events from Azure Event Hubs (azure-messaging-eventhubs)

Este início rápido mostra como enviar e receber eventos de um hub de eventos usando o pacote Java azure-messaging-eventhubs.This quickstart shows how to send events to and receive events from an event hub using the azure-messaging-eventhubs Java package.

Importante

Este início rápido usa o novo pacote azure-messaging-eventhubs.This quickstart uses the new azure-messaging-eventhubs package. Para um início rápido que usa os pacotes antigos azure-eventhubs e azure-eventhubs-eph, confira Enviar e receber eventos usando o azure-eventhubs e o azure-eventhubs-eph.For a quickstart that uses the old azure-eventhubs and azure-eventhubs-eph packages, see Send and receive events using azure-eventhubs and azure-eventhubs-eph.

Pré-requisitosPrerequisites

Se você estiver conhecendo agora os Hubs de Eventos do Azure, confira Visão geral dos Hubs de Eventos antes de prosseguir com este início rápido.If you're new to Azure Event Hubs, see Event Hubs overview before you do this quickstart.

Para concluir este início rápido, você precisará dos seguintes pré-requisitos:To complete this quickstart, you need the following prerequisites:

  • Assinatura do Microsoft Azure.Microsoft Azure subscription. Para usar os serviços do Azure, incluindo os Hubs de Eventos do Azure, você precisa ter uma assinatura.To use Azure services, including Azure Event Hubs, you need a subscription. Caso não tenha uma conta existente do Azure, inscreva-se em uma avaliação gratuita ou use os benefícios do assinante do MSDN quando criar uma conta.If you don't have an existing Azure account, you can sign up for a free trial or use your MSDN subscriber benefits when you create an account.
  • Um ambiente de desenvolvimento Java.A Java development environment. Este guia de início rápido usa Eclipse.This quickstart uses Eclipse. É necessário um JDK (Java Development Kit) com a versão 8 ou superior.Java Development Kit (JDK) with version 8 or above is required.
  • Criar um namespace de Hubs de Eventos e um hub de eventos.Create an Event Hubs namespace and an event hub. A primeira etapa é usar o portal do Azure para criar um namespace do tipo Hubs de eventos e obter as credenciais de gerenciamento das quais que seu aplicativo precisa para se comunicar com o hub de eventos.The first step is to use the Azure portal to create a namespace of type Event Hubs, and obtain the management credentials your application needs to communicate with the event hub. Para criar um namespace e um hub de eventos, siga o procedimento nesse artigo.To create a namespace and an event hub, follow the procedure in this article. Em seguida, obtenha a cadeia de conexão para o namespace dos Hubs de Eventos seguindo as instruções do artigo: Obter a cadeia de conexão.Then, get the connection string for the Event Hubs namespace by following instructions from the article: Get connection string. Você usa a cadeia de conexão posteriormente no início rápido.You use the connection string later in this quickstart.

Enviar eventosSend events

Esta seção mostra como criar um aplicativo Java para enviar eventos para um hub de eventos.This section shows you how to create a Java application to send events an event hub.

Adicionar a referência à biblioteca de Hubs de Eventos do AzureAdd reference to Azure Event Hubs library

A biblioteca de clientes Java para os Hubs de Eventos está disponível no Repositório Central do Maven.The Java client library for Event Hubs is available in the Maven Central Repository. Você pode fazer referência a essa biblioteca usando a seguinte declaração de dependência em seu arquivo do projeto Maven:You can reference this library using the following dependency declaration inside your Maven project file:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-messaging-eventhubs</artifactId>
    <version>5.0.1</version>
</dependency>

Escrever código para enviar mensagens ao hub de eventosWrite code to send messages to the event hub

Para o exemplo a seguir, primeiro crie um novo projeto do Maven para um aplicativo de console/shell em seu ambiente de desenvolvimento Java favorito.For the following sample, first create a new Maven project for a console/shell application in your favorite Java development environment. Adicione uma classe chamada Sender e adicione o seguinte código à classe:Add a class named Sender, and add the following code to the class:

import com.azure.messaging.eventhubs.*;
import static java.nio.charset.StandardCharsets.UTF_8;

public class Sender {
       public static void main(String[] args) {
    }
}

Cadeia de conexão e hub de eventosConnection string and event hub

Esse código usa a cadeia de conexão para o namespace de Hubs de Eventos e o nome do hub de eventos para criar um cliente de Hubs de Eventos.This code uses the connection string to the Event Hubs namespace and the name of the event hub to build an Event Hubs client.

String connectionString = "<CONNECTION STRING to EVENT HUBS NAMESPACE>";
String eventHubName = "<EVENT HUB NAME>";

Criar um cliente produtor de Hubs de EventosCreate an Event Hubs Producer client

Esse código cria um objeto de cliente produtor que é usado para produzir/enviar eventos para o hub de eventos.This code creates a producer client object that's used to produce/send events to the event hub.

EventHubProducerClient producer = new EventHubClientBuilder()
    .connectionString(connectionString, eventHubName)
    .buildProducerClient();

Preparar um lote de eventosPrepare a batch of events

Esse código prepara um lote de eventos.This code prepares a batch of events.

EventDataBatch batch = producer.createBatch();
batch.tryAdd(new EventData("First event"));
batch.tryAdd(new EventData("Second event"));
batch.tryAdd(new EventData("Third event"));
batch.tryAdd(new EventData("Fourth event"));
batch.tryAdd(new EventData("Fifth event"));

Enviar o lote de eventos para o hub de eventosSend the batch of events to the event hub

Esse código envia o lote de eventos que você preparou na etapa anterior para o hub de eventos.This code sends the batch of events you prepared in the previous step to the event hub. Os blocos de código a seguir na operação de envio.The following code blocks on the send operation.

producer.send(batch);

Fechar e limparClose and cleanup

Esse código fecha o produtor.This code closes the producer.

producer.close();

Código completo para enviar eventosComplete code to send events

Este é o código completo para enviar eventos para o hub de eventos.Here is the complete code to send events to the event hub.

import com.azure.messaging.eventhubs.*;

public class Sender {
    public static void main(String[] args) {
        final String connectionString = "EVENT HUBS NAMESPACE CONNECTION STRING";
        final String eventHubName = "EVENT HUB NAME";

        // create a producer using the namespace connection string and event hub name
        EventHubProducerClient producer = new EventHubClientBuilder()
            .connectionString(connectionString, eventHubName)
            .buildProducerClient();

        // prepare a batch of events to send to the event hub    
        EventDataBatch batch = producer.createBatch();
        batch.tryAdd(new EventData("First event"));
        batch.tryAdd(new EventData("Second event"));
        batch.tryAdd(new EventData("Third event"));
        batch.tryAdd(new EventData("Fourth event"));
        batch.tryAdd(new EventData("Fifth event"));

        // send the batch of events to the event hub
        producer.send(batch);

        // close the producer
        producer.close();
    }
}

Compile o programa e certifique-se de que não existem erros.Build the program, and ensure that there are no errors. Você executará esse programa depois de executar o programa receptor.You'll run this program after you run the receiver program.

Receber eventosReceive events

O código neste tutorial se baseia no exemplo de EventProcessorClient no GitHub, que você pode examinar para ver todo o aplicativo funcional.The code in this tutorial is based on the EventProcessorClient sample on GitHub, which you can examine to see the full working application.

Aviso

Se você executar esse código no Azure Stack Hub, haverá erros de runtime, a menos que você direcione uma versão específica da API de Armazenamento.If you run this code on Azure Stack Hub, you will experience runtime errors unless you target a specific Storage API version. Isso ocorre porque o SDK dos Hubs de Eventos usa a última API de Armazenamento do Azure disponível no Azure que talvez não esteja disponível na sua plataforma Azure Stack Hub.That's because the Event Hubs SDK uses the latest available Azure Storage API available in Azure that may not be available on your Azure Stack Hub platform. O Azure Stack Hub poderá dar suporte a uma versão diferente do SDK do Storage Blob do que aquelas normalmente disponíveis no Azure.Azure Stack Hub may support a different version of Storage Blob SDK than those typically available on Azure. Se estiver usando o Armazenamento de Blobs do Azure como um repositório de pontos de verificação, verifique a versão da API do Armazenamento do Azure com suporte para o build do Azure Stack Hub e tenha como destino essa versão no código.If you are using Azure Blog Storage as a checkpoint store, check the supported Azure Storage API version for your Azure Stack Hub build and target that version in your code.

Por exemplo, se a execução estiver sendo feita no Azure Stack Hub versão 2005, a versão mais recente disponível para o serviço de Armazenamento será a versão 2019-02-02.For example, If you are running on Azure Stack Hub version 2005, the highest available version for the Storage service is version 2019-02-02. Por padrão, a biblioteca de clientes do SDK dos Hubs de Eventos usa a versão mais recente disponível no Azure (2019-07-07, no momento da liberação do SDK).By default, the Event Hubs SDK client library uses the highest available version on Azure (2019-07-07 at the time of the release of the SDK). Nesse caso, além de seguir as etapas desta seção, você também precisará adicionar o código para ter como destino a versão de API 2019-02-02 do serviço de Armazenamento.In this case, besides following steps in this section, you will also need to add code to target the Storage service API version 2019-02-02. Para obter um exemplo de como ter como destino uma versão de API específica do Armazenamento, confira esta amostra no GitHub.For an example on how to target a specific Storage API version, see this sample on GitHub.

Criar um Armazenamento do Azure e um contêiner de blobCreate an Azure Storage and a blob container

Neste guia de início rápido, você usará o Armazenamento do Azure (especificamente, o Armazenamento de Blobs) como o repositório de pontos de verificação.In this quickstart, you use Azure Storage (specifically, Blob Storage) as the checkpoint store. A marcação de pontos de verificação é um processo pelo qual um processador de eventos marca ou confirma a posição do último evento processado com êxito em uma partição.Checkpointing is a process by which an event processor marks or commits the position of the last successfully processed event within a partition. Normalmente, a marcação de um ponto de verificação é feita na função que processa os eventos.Marking a checkpoint is typically done within the function that processes the events. Para saber mais sobre a marcação de pontos de verificação, confira Processador de eventos.To learn more about checkpointing, see Event processor.

Siga estas etapas para criar uma conta de Armazenamento do Azure.Follow these steps to create an Azure Storage account.

  1. Crie uma conta de Armazenamento do AzureCreate an Azure Storage account

  2. Crie um contêiner de blobCreate a blob container

  3. Obtenha a cadeia de conexão para a conta de armazenamentoGet the connection string to the storage account

    Anote a cadeia de conexão e o nome do contêiner.Note down the connection string and the container name. Você os usará no código de recebimento.You'll use them in the receive code.

Adicionar bibliotecas dos Hubs de Eventos ao seu projeto JavaAdd Event Hubs libraries to your Java project

Adicione as dependências a seguir ao arquivo pom.xml.Add the following dependencies in the pom.xml file.

<dependencies>
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-messaging-eventhubs</artifactId>
        <version>5.1.1</version>
    </dependency>
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>
  1. Adicione as instruções import a seguir à parte superior do arquivo Java.Add the following import statements at the top of the Java file.

    import com.azure.messaging.eventhubs.EventHubClientBuilder;
    import com.azure.messaging.eventhubs.EventProcessorClient;
    import com.azure.messaging.eventhubs.EventProcessorClientBuilder;
    import com.azure.messaging.eventhubs.checkpointstore.blob.BlobCheckpointStore;
    import com.azure.messaging.eventhubs.models.ErrorContext;
    import com.azure.messaging.eventhubs.models.EventContext;
    import com.azure.storage.blob.BlobContainerAsyncClient;
    import com.azure.storage.blob.BlobContainerClientBuilder;
    import java.util.function.Consumer;
    import java.util.concurrent.TimeUnit;
    
  2. Crie uma classe chamada Receiver e adicione as variáveis de cadeia de caracteres a seguir à classe.Create a class named Receiver, and add the following string variables to the class. Substitua os espaços reservados pelos valores corretos.Replace the placeholders with the correct values.

    private static final String EH_NAMESPACE_CONNECTION_STRING = "<EVENT HUBS NAMESPACE CONNECTION STRING>";
    private static final String eventHubName = "<EVENT HUB NAME>";
    private static final String STORAGE_CONNECTION_STRING = "<AZURE STORAGE CONNECTION STRING>";
    private static final String STORAGE_CONTAINER_NAME = "<AZURE STORAGE CONTAINER NAME>";
    
  3. Adicione o método main a seguir à classe.Add the following main method to the class.

    public static void main(String[] args) throws Exception {
        // Create a blob container client that you use later to build an event processor client to receive and process events
        BlobContainerAsyncClient blobContainerAsyncClient = new BlobContainerClientBuilder()
            .connectionString(STORAGE_CONNECTION_STRING) 
            .containerName(STORAGE_CONTAINER_NAME) 
            .buildAsyncClient();
    
        // Create a builder object that you will use later to build an event processor client to receive and process events and errors.
        EventProcessorClientBuilder eventProcessorClientBuilder = new EventProcessorClientBuilder()
            .connectionString(EH_NAMESPACE_CONNECTION_STRING, eventHubName) 
            .consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME)
            .processEvent(PARTITION_PROCESSOR) 
            .processError(ERROR_HANDLER) 
            .checkpointStore(new BlobCheckpointStore(blobContainerAsyncClient)); 
    
        // Use the builder object to create an event processor client 
        EventProcessorClient eventProcessorClient = eventProcessorClientBuilder.buildEventProcessorClient();
    
        System.out.println("Starting event processor");
        eventProcessorClient.start();
    
        System.out.println("Press enter to stop.");
        System.in.read();
    
        System.out.println("Stopping event processor");
        eventProcessorClient.stop();
        System.out.println("Event processor stopped.");
    
        System.out.println("Exiting process");
    }    
    
  4. Adicione os dois métodos auxiliares (PARTITION_PROCESSOR e ERROR_HANDLER) que processam eventos e erros para a classe Receiver.Add the two helper methods (PARTITION_PROCESSOR and ERROR_HANDLER) that process events and errors to the Receiver class.

    public static final Consumer<EventContext> PARTITION_PROCESSOR = eventContext -> {
        System.out.printf("Processing event from partition %s with sequence number %d with body: %s %n", 
                eventContext.getPartitionContext().getPartitionId(), eventContext.getEventData().getSequenceNumber(), eventContext.getEventData().getBodyAsString());
    
        if (eventContext.getEventData().getSequenceNumber() % 10 == 0) {
            eventContext.updateCheckpoint();
        }
    };
    
    public static final Consumer<ErrorContext> ERROR_HANDLER = errorContext -> {
        System.out.printf("Error occurred in partition processor for partition %s, %s.%n",
            errorContext.getPartitionContext().getPartitionId(),
            errorContext.getThrowable());
    };    
    
  5. O código completo deverá ser semelhante a:The complete code should look like:

    
    import com.azure.messaging.eventhubs.EventHubClientBuilder;
    import com.azure.messaging.eventhubs.EventProcessorClient;
    import com.azure.messaging.eventhubs.EventProcessorClientBuilder;
    import com.azure.messaging.eventhubs.checkpointstore.blob.BlobCheckpointStore;
    import com.azure.messaging.eventhubs.models.ErrorContext;
    import com.azure.messaging.eventhubs.models.EventContext;
    import com.azure.storage.blob.BlobContainerAsyncClient;
    import com.azure.storage.blob.BlobContainerClientBuilder;
    import java.util.function.Consumer;
    import java.util.concurrent.TimeUnit;
    
    public class Receiver {
    
        private static final String EH_NAMESPACE_CONNECTION_STRING = "<EVENT HUBS NAMESPACE CONNECTION STRING>";
        private static final String eventHubName = "<EVENT HUB NAME>";
        private static final String STORAGE_CONNECTION_STRING = "<AZURE STORAGE CONNECTION STRING>";
        private static final String STORAGE_CONTAINER_NAME = "<AZURE STORAGE CONTAINER NAME>";
    
        public static final Consumer<EventContext> PARTITION_PROCESSOR = eventContext -> {
        System.out.printf("Processing event from partition %s with sequence number %d with body: %s %n", 
                eventContext.getPartitionContext().getPartitionId(), eventContext.getEventData().getSequenceNumber(), eventContext.getEventData().getBodyAsString());
    
            if (eventContext.getEventData().getSequenceNumber() % 10 == 0) {
                eventContext.updateCheckpoint();
            }
        };
    
        public static final Consumer<ErrorContext> ERROR_HANDLER = errorContext -> {
            System.out.printf("Error occurred in partition processor for partition %s, %s.%n",
                errorContext.getPartitionContext().getPartitionId(),
                errorContext.getThrowable());
        };
    
        public static void main(String[] args) throws Exception {
            BlobContainerAsyncClient blobContainerAsyncClient = new BlobContainerClientBuilder()
                .connectionString(STORAGE_CONNECTION_STRING)
                .containerName(STORAGE_CONTAINER_NAME)
                .buildAsyncClient();
    
            EventProcessorClientBuilder eventProcessorClientBuilder = new EventProcessorClientBuilder()
                .connectionString(EH_NAMESPACE_CONNECTION_STRING, eventHubName)
                .consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME)
                .processEvent(PARTITION_PROCESSOR)
                .processError(ERROR_HANDLER)
                .checkpointStore(new BlobCheckpointStore(blobContainerAsyncClient));
    
            EventProcessorClient eventProcessorClient = eventProcessorClientBuilder.buildEventProcessorClient();
    
            System.out.println("Starting event processor");
            eventProcessorClient.start();
    
            System.out.println("Press enter to stop.");
            System.in.read();
    
            System.out.println("Stopping event processor");
            eventProcessorClient.stop();
            System.out.println("Event processor stopped.");
    
            System.out.println("Exiting process");
        }
    
    }
    
  6. Compile o programa e certifique-se de que não existem erros.Build the program, and ensure that there are no errors.

Executar os aplicativosRun the applications

  1. Execute primeiro o aplicativo receptor.Run the receiver application first.
  2. Em seguida, execute o aplicativo remetente.Then, run the sender application.
  3. Na janela do aplicativo receptor, confirme se você vê os eventos que foram publicados pelo aplicativo remetente.In the receiver application window, confirm that you see the events that were published by the sender application.
  4. Pressione ENTER na janela do aplicativo receptor para interromper o aplicativo.Press ENTER in the receiver application window to stop the application.

Próximas etapasNext steps

Confira as seguintes amostras no GitHub:See the following samples on GitHub: