Envío o recepción de eventos en Azure Event Hubs mediante .NET FrameworkSend events to or receive events from Azure Event Hubs using .NET Framework

Azure Event Hubs es una plataforma de streaming de macrodatos y servicio de ingesta de eventos de gran escalabilidad capaz de recibir y procesar millones de eventos por segundo.Azure Event Hubs is a Big Data streaming platform and event ingestion service, capable of receiving and processing millions of events per second. Event Hubs puede procesar y almacenar eventos, datos o telemetría generados por dispositivos y software distribuido.Event Hubs can process and store events, data, or telemetry produced by distributed software and devices. Los datos enviados a un centro de eventos se pueden transformar y almacenar con cualquier proveedor de análisis en tiempo real o adaptadores de procesamiento por lotes y almacenamiento.Data sent to an event hub can be transformed and stored using any real-time analytics provider or batching/storage adapters. Para más información sobre Event Hubs, consulte Introducción a Event Hubs y Características de Event Hubs.For detailed overview of Event Hubs, see Event Hubs overview and Event Hubs features.

En este tutorial se describe cómo crear aplicaciones de consola de .NET Framework en C# para enviar o recibir eventos en un centro de eventos.This tutorial shows how to create .NET Framework console applications in C# to send events to or receive events from an eventhub.

Requisitos previosPrerequisites

Para completar este tutorial, debe cumplir los siguientes requisitos previos:To complete this tutorial, you need the following prerequisites:

  • Microsoft Visual Studio 2019.Microsoft Visual Studio 2019.
  • Creación de un espacio de nombres de Event Hubs y un centro de eventosCreate an Event Hubs namespace and an event hub. El primer paso consiste en usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de administración que la aplicación necesita para comunicarse con el centro 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 crear un espacio de nombres y un centro de eventos, siga el procedimiento que se indica en este artículo.To create a namespace and an event hub, follow the procedure in this article. A continuación, obtenga la cadena de conexión para el espacio de nombres del centro de eventos siguiendo las instrucciones del artículo: Obtenga la cadena de conexión.Then, get the connection string for the event hub namespace by following instructions from the article: Get connection string. Utilizará la cadena de conexión más adelante en el tutorial.You use the connection string later in this tutorial.

Envío de eventosSend events

En esta sección se muestra cómo crear una aplicación de consola de .NET Framework para enviar eventos a un centro de eventos.This section shows you how to create a .NET Framework console application to send events to an event hub.

Creación de una aplicación de consolaCreate a console application

En Visual Studio, cree un nuevo proyecto de aplicación de escritorio de Visual C# con la plantilla de proyecto Aplicación de consola .In Visual Studio, create a new Visual C# Desktop App project using the Console Application project template. Asigne al proyecto el nombre Remitente.Name the project Sender.

Creación de una aplicación de consola

Incorporación del paquete NuGet de Event HubsAdd the Event Hubs NuGet package

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto Remitente y luego haga clic en Administrar paquetes NuGet para la solución.In Solution Explorer, right-click the Sender project, and then click Manage NuGet Packages for Solution.

  2. Haga clic en la pestaña Examinar y luego busque WindowsAzure.ServiceBus.Click the Browse tab, then search for WindowsAzure.ServiceBus. Haga clic en Instalary acepte las condiciones de uso.Click Install, and accept the terms of use.

    Instalación del paquete NuGet de Service Bus

    Visual Studio descarga, instala y agrega una referencia al paquete NuGet de la biblioteca de Azure Service Bus.Visual Studio downloads, installs, and adds a reference to the Azure Service Bus library NuGet package.

Escritura de código para enviar mensajes al centro de eventosWrite code to send messages to the event hub

  1. Agregue las siguientes instrucciones using al principio del archivo Program.cs :Add the following using statements at the top of the Program.cs file:

    using System.Threading;
    using Microsoft.ServiceBus.Messaging;
    
  2. Agregue los siguientes campos a la clase Program; para ello, sustituya los valores del marcador de posición por el nombre del centro de eventos creado en la sección anterior y la cadena de conexión de nivel del espacio de nombres que ha guardado anteriormente.Add the following fields to the Program class, substituting the placeholder values with the name of the event hub you created in the previous section, and the namespace-level connection string you saved previously. Puede copiar la cadena de conexión para el centro de eventos desde la clave Connection string-primary en RootManageSharedAccessKey en la página del centro de eventos en Azure Portal.You can copy connection string for your event hub from Connection string-primary key under RootManageSharedAccessKey on the Event Hub page in the Azure portal. Para ver los pasos detallados, consulte Obtención de la cadena de conexión.For detailed steps, see Get connection string.

    static string eventHubName = "Your Event Hub name";
    static string connectionString = "namespace connection string";
    
  3. Agregue el método siguiente a la clase Program :Add the following method to the Program class:

    static void SendingRandomMessages()
    {
        var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);
        while (true)
        {
            try
            {
                var message = Guid.NewGuid().ToString();
                Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, message);
                eventHubClient.Send(new EventData(Encoding.UTF8.GetBytes(message)));
            }
            catch (Exception exception)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("{0} > Exception: {1}", DateTime.Now, exception.Message);
                Console.ResetColor();
            }
    
            Thread.Sleep(200);
        }
    }
    

    Este método envía continuamente los eventos al centro de eventos con un retraso de 200 ms.This method continuously sends events to your event hub with a 200-ms delay.

  4. Por último, agregue las líneas siguientes al método Main :Finally, add the following lines to the Main method:

    Console.WriteLine("Press Ctrl-C to stop the sender process");
    Console.WriteLine("Press Enter to start now");
    Console.ReadLine();
    SendingRandomMessages();
    
  5. Ejecute el programa y asegúrese de que no hay ningún error.Run the program, and ensure that there are no errors.

Recepción de eventosReceive events

En esta sección, escribirá una aplicación de consola de .NET Framework que recibe mensajes de un centro de eventos mediante el host de procesador de eventos.In this section, you write a .NET Framework console application that receives messages from an event hub using the Event Processor Host. El host de procesador de eventos es una clase de .NET que simplifica la recepción de eventos desde Event Hubs mediante la administración de puntos de control persistentes y recepciones paralelas desde dichas instancias de Event Hubs.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. Mediante el host de procesador de eventos, puede dividir eventos entre varios receptores, aunque estén hospedados en distintos nodos.Using the Event Processor Host, you can split events across multiple receivers, even when hosted in different nodes.

Creación de una cuenta de almacenamiento para el host de procesador de eventosCreate a storage account for Event Processor Host

El host de procesador de eventos es un agente inteligente que simplifica la recepción de eventos desde Event Hubs mediante la administración de puntos de control persistentes y recepciones paralelas.The Event Processor Host is an intelligent agent that simplifies receiving events from Event Hubs by managing persistent checkpoints and parallel receives. Para los puntos de comprobación, el host de procesador de eventos requiere una cuenta de almacenamiento.For checkpointing, the Event Processor Host requires a storage account. El ejemplo siguiente muestra cómo crear una cuenta de almacenamiento y cómo obtener sus claves para el acceso:The following example shows how to create a storage account and how to get its keys for access:

  1. En Azure Portal, seleccione Crear un recurso en la parte superior izquierda de la pantalla.In the Azure portal, and select Create a resource at the top left of the screen.

  2. Seleccione Storage y, a continuación, seleccione Storage account - blob, file, table, queue (Cuenta de almacenamiento: blob, archivo, tabla, cola).Select Storage, then select Storage account - blob, file, table, queue.

    Seleccionar Cuenta de almacenamiento

  3. En la página Crear cuenta de almacenamiento, realice los pasos siguientes:On the Create storage account page, take the following steps:

    1. Escriba un nombre para la cuenta de almacenamiento.Enter a name for the storage account.

    2. Elija una suscripción de Azure que contenga el centro de eventos.Choose an Azure subscription that contains the event hub.

    3. Seleccione el grupo de recursos que tenga el centro de eventos.Select the resource group that has the event hub.

    4. Seleccione una ubicación en la que crear el recurso.Select a location in which to create the resource.

    5. Después, haga clic en Revisar + crear.Then click Review + create.

      Página Crear cuenta de almacenamiento

  4. En la página Revisar + crear, revise los valores y seleccione Crear.On the Review + create page, review the values, and select Create.

    Revisión de la configuración de la cuenta de almacenamiento y creación

  5. Una vez que aparezca el mensaje Implementaciones correctas, seleccione Ir al recurso en la parte superior de la página.After you see the Deployments Succeeded message, select Go to resource at the top of the page. También puede iniciar la página Cuenta de almacenamiento seleccionando la cuenta de almacenamiento en la lista de recursos.You can also launch the Storage Account page by selecting your storage account from the resource list.

    Selección de la cuenta de almacenamiento desde la implementación

  6. En la ventana Información esencial, haga clic en Blobs.In the Essentials window, select Blobs.

    Selección del servicio Blobs

  7. Seleccione + Contenedor en la parte superior, escriba un nombre para el contenedor y seleccione Aceptar.Select + Container at the top, enter a name for the container, and select OK.

    Creación de un contenedor de blobs

  8. Seleccione Claves de acceso en el menú de la izquierda y copie el valor de key1.Select Access keys in the left-side menu, and copy the value of key1.

    Guarde los valores siguientes en el Bloc de notas o en cualquier otra ubicación temporal.Save the following values to Notepad or some other temporary location.

    • Nombre de la cuenta de almacenamientoName of the storage account
    • Clave de acceso para la cuenta de almacenamientoAccess key for the storage account
    • Nombre del contenedorName of the container

Creación de una aplicación de consolaCreate a console application

En Visual Studio, cree un nuevo proyecto de aplicación de escritorio de Visual C# con la plantilla de proyecto Aplicación de consola.In Visual Studio, create a new Visual C# Desktop App project using the Console Application project template. Asigne al proyecto el nombre Receptor.Name the project Receiver.

Creación de una aplicación de consola

Incorporación del paquete NuGet de Event HubsAdd the Event Hubs NuGet package

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto Receptor y luego haga clic en Administrar paquetes NuGet para la solución.In Solution Explorer, right-click the Receiver project, and then click Manage NuGet Packages for Solution.

  2. Haga clic en la pestaña Examinar y luego busque Microsoft Azure Service Bus Event Hub - EventProcessorHost.Click the Browse tab, then search for Microsoft Azure Service Bus Event Hub - EventProcessorHost. Haga clic en Instalary acepte las condiciones de uso.Click Install, and accept the terms of use.

    Búsqueda del paquete NuGet del host del procesador de eventos

    Visual Studio descarga, instala y agrega una referencia al paquete de NuGet de Azure Service Bus - EventProcessorHost, con todas sus dependencias.Visual Studio downloads, installs, and adds a reference to the Azure Service Bus Event Hub - EventProcessorHost NuGet package, with all its dependencies.

Implementación de la interfaz de IEventProcessorImplement the IEventProcessor interface

  1. Haga clic con el botón derecho en el proyecto Receptor, haga clic en Agregar y, después, haga clic en Clase.Right-click the Receiver project, click Add, and then click Class. Asigne a la nueva clase el nombre SimpleEventProcessor y después haga clic en Agregar para crear la clase.Name the new class SimpleEventProcessor, and then click Add to create the class.

    Incorporación de la clase SimpleEventProcessor

  2. Agregue las siguientes instrucciones en la parte superior del archivo SimpleEventProcessor.cs:Add the following statements at the top of the SimpleEventProcessor.cs file:

    using Microsoft.ServiceBus.Messaging;
    using System.Diagnostics;
    
  3. Sustituya el código siguiente por el cuerpo de la clase: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();
          }
      }
    }
    

    EventProcessorHost llama a esta clase para procesar los eventos recibidos del centro de eventos.This class is called by the EventProcessorHost to process events received from the event hub. La clase SimpleEventProcessor usa un cronómetro para llamar periódicamente al método de punto de control en el contexto EventProcessorHost.The SimpleEventProcessor class uses a stopwatch to periodically call the checkpoint method on the EventProcessorHost context. Este procesamiento garantiza que, si se reinicia el destinatario, no se pierden más de cinco minutos de trabajo de procesamiento.This processing ensures that, if the receiver is restarted, it loses no more than five minutes of processing work.

Actualización del método Main para usar SimpleEventProcessorUpdate the Main method to use SimpleEventProcessor

  1. En la clase Program.cs, agregue la siguiente instrucción using al principio del archivo:In the Program class, add the following using statement at the top of the file:

    using Microsoft.ServiceBus.Messaging;
    
  2. Reemplace el método Main de la clase Program por el código siguiente, y sustituya el nombre del centro de eventos y la cadena de conexión de nivel del espacio de nombres que ha guardado anteriormente, y la cuenta de almacenamiento y la clave que ha copiado en las secciones anteriores.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();
    }
    
  3. Ejecute el programa y asegúrese de que no hay ningún error.Run the program, and ensure that there are no errors.

Pasos siguientesNext steps

Lea los siguientes artículos:Read the following articles: