Ricevere eventi da Hub eventi di Azure usando .NET FrameworkReceive events from Azure Event Hubs using the .NET Framework

IntroduzioneIntroduction

Hub eventi è un servizio che consente di elaborare grandi quantità di dati di telemetria sugli eventi da applicazioni e dispositivi connessi.Event Hubs is a service that processes large amounts of event data (telemetry) from connected devices and applications. Dopo aver raccolto i dati in Hub eventi, è possibile archiviarli usando un cluster di archiviazione o trasformarli usando un provider di analisi in tempo reale.After you collect data into Event Hubs, you can store the data using a storage cluster or transform it using a real-time analytics provider. Questa funzionalità di elaborazione e raccolta di eventi su vasta scala rappresenta un componente chiave delle moderne architetture di applicazioni, tra cui Internet delle cose (IoT).This large-scale event collection and processing capability is a key component of modern application architectures including the Internet of Things (IoT).

Questa esercitazione illustra come scrivere un'applicazione console .NET Framework che riceve messaggi da un hub eventi usando l'host processore di eventi.This tutorial shows how to write a .NET Framework console application that receives messages from an event hub using the Event Processor Host. Per inviare eventi usando .NET Framework, vedere Inviare eventi a Hub eventi di Azure usando .NET Framework oppure fare clic sul linguaggio di invio appropriato nel sommario a sinistra.To send events using the .NET Framework, see the Send events to Azure Event Hubs using the .NET Framework article, or click the appropriate sending language in the left-hand table of contents.

L'host processore di eventi è una classe .NET che semplifica la ricezione di eventi dagli hub eventi gestendo checkpoint persistenti e ricezioni parallele da tali hub.The Event Processor Host is a .NET class that simplifies receiving events from event hubs by managing persistent checkpoints and parallel receives from those event hubs. Usando l'host processore di eventi è possibile suddividere gli eventi su più ricevitori, anche se ospitati in nodi diversi.Using the Event Processor Host, you can split events across multiple receivers, even when hosted in different nodes. Questo esempio illustra come usare l'host processore di eventi per un ricevitore singolo.This example shows how to use the Event Processor Host for a single receiver. L'esempio di elaborazione di eventi con aumento del numero di istanze illustra come usare l'host processore di eventi con più ricevitori.The Scale out event processing sample shows how to use the Event Processor Host with multiple receivers.

PrerequisitiPrerequisites

Per completare questa esercitazione è necessario soddisfare i prerequisiti seguenti:To complete this tutorial, you need the following prerequisites:

Creare uno spazio dei nomi di Hub eventi e un hub eventiCreate an Event Hubs namespace and an event hub

Il primo passaggio consiste nell'usare il portale di Azure per creare uno spazio dei nomi di tipo Hub eventi e ottenere le credenziali di gestione necessarie all'applicazione per comunicare con l'hub eventi.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. Per creare uno spazio dei nomi e un hub eventi, seguire la procedura descritta in questo articolo e quindi procedere con i passaggi seguenti di questa esercitazione.To create a namespace and event hub, follow the procedure in this article, then proceed with the following steps in this tutorial.

Creare un account di Archiviazione di AzureCreate an Azure Storage account

Per usare l'host processore di eventi è necessario un account di archiviazione di Azure:To use the Event Processor Host, you must have an Azure Storage account:

  1. Accedere al portale di Azure e fare clic su Nuovo nella parte superiore sinistra della schermata.Log on to the Azure portal, and click New at the top left of the screen.
  2. Fare clic su Archiviazione e quindi su Account di archiviazione.Click Storage, then click Storage account.

  3. Nel pannello Crea account di archiviazione digitare un nome per l'account di archiviazione.In the Create storage account blade, type a name for the storage account. Scegliere una sottoscrizione, un gruppo di risorse e una località di Azure in cui creare la risorsa.Choose an Azure subscription, resource group, and location in which to create the resource. Fare quindi clic su Crea.Then click Create.

  4. Nell'elenco degli account di archiviazione fare clic su quello appena creato.In the list of storage accounts, click the newly created storage account.
  5. Nel pannello Account di archiviazione fare clic su Chiavi di accesso.In the storage account blade, click Access keys. Copiare il valore di key1 da usare più avanti in questa esercitazione.Copy the value of key1 to use later in this tutorial.

Creare un'applicazione console per il ricevitoreCreate a receiver console application

  1. In Visual Studio creare un nuovo progetto di app desktop di Visual C# usando il modello di progetto Applicazione console.In Visual Studio, create a new Visual C# Desktop App project using the Console Application project template. Assegnare al progetto il nome Receiver.Name the project Receiver.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto Receiver, quindi scegliere Gestisci pacchetti NuGet per la soluzione.In Solution Explorer, right-click the Receiver project, and then click Manage NuGet Packages for Solution.
  3. Fare clic sulla scheda Sfoglia e quindi cercare Microsoft Azure Service Bus Event Hub - EventProcessorHost.Click the Browse tab, then search for Microsoft Azure Service Bus Event Hub - EventProcessorHost. Fare clic su Installae accettare le condizioni per l'utilizzo.Click Install, and accept the terms of use.

    Visual Studio scarica e installa il pacchetto NuGet Azure Service Bus Event Hub - EventProcessorHoste aggiunge un riferimento al pacchetto con tutte le relative dipendenze.Visual Studio downloads, installs, and adds a reference to the Azure Service Bus Event Hub - EventProcessorHost NuGet package, with all its dependencies.

  4. Fare clic con il pulsante destro del mouse sul progetto Receiver, scegliere Aggiungi e quindi Classe.Right-click the Receiver project, click Add, and then click Class. Assegnare alla nuova classe il nome SimpleEventProcessor e quindi fare clic su Aggiungi per crearla.Name the new class SimpleEventProcessor, and then click Add to create the class.

  5. Aggiungere le istruzioni seguenti all'inizio del file SimpleEventProcessor.cs:Add the following statements at the top of the SimpleEventProcessor.cs file:

    using Microsoft.ServiceBus.Messaging;
    using System.Diagnostics;
    

    Sostituire quindi il corpo della classe con il codice seguente:Then, substitute the following code for the body of the class:

    class SimpleEventProcessor : IEventProcessor
    {
     Stopwatch checkpointStopWatch;
    
     async Task IEventProcessor.CloseAsync(PartitionContext context, CloseReason reason)
     {
         Console.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason);
         if (reason == CloseReason.Shutdown)
         {
             await context.CheckpointAsync();
         }
     }
    
     Task IEventProcessor.OpenAsync(PartitionContext context)
     {
         Console.WriteLine("SimpleEventProcessor initialized.  Partition: '{0}', Offset: '{1}'", context.Lease.PartitionId, context.Lease.Offset);
         this.checkpointStopWatch = new Stopwatch();
         this.checkpointStopWatch.Start();
         return Task.FromResult<object>(null);
     }
    
     async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
     {
         foreach (EventData eventData in messages)
         {
             string data = Encoding.UTF8.GetString(eventData.GetBytes());
    
             Console.WriteLine(string.Format("Message received.  Partition: '{0}', Data: '{1}'",
                 context.Lease.PartitionId, data));
         }
    
         //Call checkpoint every 5 minutes, so that worker can resume processing from 5 minutes back if it restarts.
         if (this.checkpointStopWatch.Elapsed > TimeSpan.FromMinutes(5))
         {
             await context.CheckpointAsync();
             this.checkpointStopWatch.Restart();
         }
     }
    }
    

    Questa classe è chiamata da EventProcessorHost per elaborare gli eventi ricevuti dall'hub eventi.This class is called by the EventProcessorHost to process events received from the event hub. La classe SimpleEventProcessor usa un cronometro per chiamare periodicamente il metodo checkpoint sul contesto di EventProcessorHost.The SimpleEventProcessor class uses a stopwatch to periodically call the checkpoint method on the EventProcessorHost context. Questa elaborazione assicura che, se il ricevitore viene riavviato, non perde più di cinque minuti di lavoro di elaborazione.This processing ensures that, if the receiver is restarted, it loses no more than five minutes of processing work.

  6. Nella classe Program aggiungere l'istruzione using seguente all'inizio del file:In the Program class, add the following using statement at the top of the file:

    using Microsoft.ServiceBus.Messaging;
    

    Sostituire quindi il metodo Main nella classe Program con il codice seguente, sostituendo il nome dell'hub eventi e la stringa di connessione a livello di spazio dei nomi salvata in precedenza, nonché l'account di archiviazione e la chiave copiata nelle sezioni precedenti.Then, replace the Main method in the Program class with the following code, substituting the event hub name and the namespace-level connection string that you saved previously, and the storage account and key that you copied in the previous sections.

    static void Main(string[] args)
    {
     string eventHubConnectionString = "{Event Hubs namespace connection string}";
     string eventHubName = "{Event Hub name}";
     string storageAccountName = "{storage account name}";
     string storageAccountKey = "{storage account key}";
     string storageConnectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", storageAccountName, storageAccountKey);
    
     string eventProcessorHostName = Guid.NewGuid().ToString();
     EventProcessorHost eventProcessorHost = new EventProcessorHost(eventProcessorHostName, eventHubName, EventHubConsumerGroup.DefaultGroupName, eventHubConnectionString, storageConnectionString);
     Console.WriteLine("Registering EventProcessor...");
     var options = new EventProcessorOptions();
     options.ExceptionReceived += (sender, e) => { Console.WriteLine(e.Exception); };
     eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>(options).Wait();
    
     Console.WriteLine("Receiving. Press enter key to stop worker.");
     Console.ReadLine();
     eventProcessorHost.UnregisterEventProcessorAsync().Wait();
    }
    
  7. Eseguire il programma e assicurarsi che non siano presenti errori.Run the program, and ensure that there are no errors.

Congratulazioni.Congratulations! Sono stati ricevuti messaggi da un hub eventi usando l'host processore di eventi.You have now received messages from an event hub using the Event Processor Host.

Nota

Questa esercitazione usa una singola istanza di EventProcessorHost.This tutorial uses a single instance of EventProcessorHost. Per aumentare la velocità effettiva, è consigliabile eseguire più istanze di EventProcessorHost, come illustrato nell'esempio di [elaborazione di eventi con aumento del numero di istanze][elaborazione di eventi con aumento del numero di istanze].To increase throughput, it is recommended that you run multiple instances of EventProcessorHost, as shown in the [Scaled out event processing][Scaled out event processing] sample. In questi casi, le varie istanze si coordinano automaticamente tra loro per ottenere il bilanciamento del carico relativo agli eventi ricevuti.In those cases, the various instances automatically coordinate with each other to load balance the received events. Se si vuole che ognuno dei vari ricevitori elabori tutti gli eventi, è necessario usare il concetto ConsumerGroup .If you want multiple receivers to each process all the events, you must use the ConsumerGroup concept. Quando si ricevono eventi da più macchine, potrebbe risultare utile specificare nomi per le istanze di EventProcessorHost in base alle macchine (o ai ruoli) in cui sono distribuite.When receiving events from different machines, it might be useful to specify names for EventProcessorHost instances based on the machines (or roles) in which they are deployed. Per altre informazioni su questi argomenti, vedere Panoramica di Hub eventi e gli argomenti della Guida alla programmazione di Hub eventi.For more information about these topics, see the Event Hubs overview and the Event Hubs programming guide topics.

Passaggi successiviNext steps

Ora che è stata creata un'applicazione funzionante che crea un hub eventi e invia e riceve dati, è possibile ottenere altre informazioni visitando i collegamenti seguenti:Now that you've built a working application that creates an event hub and sends and receives data, you can learn more by visiting the following links: