Ricevere eventi da Hub eventi di Azure usando .NET Framework

Introduzione

Hub eventi è un servizio che consente di elaborare grandi quantità di dati di telemetria sugli eventi da applicazioni e dispositivi connessi. 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. 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).

Questa esercitazione illustra come scrivere un'applicazione console .NET Framework che riceve messaggi da un hub eventi usando l'host processore di eventi. 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.

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. Usando l'host processore di eventi è possibile suddividere gli eventi su più ricevitori, anche se ospitati in nodi diversi. Questo esempio illustra come usare l'host processore di eventi per un ricevitore singolo. L'esempio di elaborazione di eventi con aumento del numero di istanze illustra come usare l'host processore di eventi con più ricevitori.

Prerequisiti

Per completare questa esercitazione è necessario soddisfare i prerequisiti seguenti:

Creare uno spazio dei nomi di Hub eventi e un hub eventi

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. 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.

Creare un account di Archiviazione di Azure

Per usare l'host processore di eventi è necessario un account di archiviazione di Azure:

  1. Accedere al portale di Azure e fare clic su Nuovo nella parte superiore sinistra della schermata.
  2. Fare clic su Archiviazione e quindi su Account di archiviazione.

  3. Nel pannello Crea account di archiviazione digitare un nome per l'account di archiviazione. Scegliere una sottoscrizione, un gruppo di risorse e una località di Azure in cui creare la risorsa. Fare quindi clic su Crea.

  4. Nell'elenco degli account di archiviazione fare clic su quello appena creato.
  5. Nel pannello Account di archiviazione fare clic su Chiavi di accesso. Copiare il valore di key1 da usare più avanti in questa esercitazione.

Creare un'applicazione console per il ricevitore

  1. In Visual Studio creare un nuovo progetto di app desktop di Visual C# usando il modello di progetto Applicazione console. Assegnare al progetto il nome Receiver.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto Receiver, quindi scegliere Gestisci pacchetti NuGet per la soluzione.
  3. Fare clic sulla scheda Sfoglia e quindi cercare Microsoft Azure Service Bus Event Hub - EventProcessorHost. Fare clic su Installae accettare le condizioni per l'utilizzo.

    Visual Studio scarica e installa il pacchetto NuGet Azure Service Bus Event Hub - EventProcessorHoste aggiunge un riferimento al pacchetto con tutte le relative dipendenze.

  4. Fare clic con il pulsante destro del mouse sul progetto Receiver, scegliere Aggiungi e quindi Classe. Assegnare alla nuova classe il nome SimpleEventProcessor e quindi fare clic su Aggiungi per crearla.

  5. Aggiungere le istruzioni seguenti all'inizio del file SimpleEventProcessor.cs:

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

    Sostituire quindi il corpo della classe con il codice seguente:

    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. La classe SimpleEventProcessor usa un cronometro per chiamare periodicamente il metodo checkpoint sul contesto di EventProcessorHost. Questa elaborazione assicura che, se il ricevitore viene riavviato, non perde più di cinque minuti di lavoro di elaborazione.

  6. Nella classe Program aggiungere l'istruzione using seguente all'inizio del 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.

    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.

Congratulazioni. Sono stati ricevuti messaggi da un hub eventi usando l'host processore di eventi.

Nota

Questa esercitazione usa una singola istanza di 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]. In questi casi, le varie istanze si coordinano automaticamente tra loro per ottenere il bilanciamento del carico relativo agli eventi ricevuti. Se si vuole che ognuno dei vari ricevitori elabori tutti gli eventi, è necessario usare il concetto ConsumerGroup . 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. Per altre informazioni su questi argomenti, vedere Panoramica di Hub eventi e gli argomenti della Guida alla programmazione di Hub eventi.

Passaggi successivi

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: