Envío de eventos a Azure Event Hubs mediante CSend events to Azure Event Hubs using C

IntroducciónIntroduction

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 enviar eventos a un centro de eventos mediante una aplicación de consola en C.This tutorial describes how to send events to an event hub using a console application in C.

Requisitos previosPrerequisites

Para completar este tutorial, necesitará lo siguiente:To complete this tutorial, you need the following:

  • Un entorno de desarrollo de C.A C development environment. Para este tutorial se presupone el uso de la pila de gcc en una máquina virtual Linux de Azure con Ubuntu 14.04.This tutorial assumes the gcc stack on an Azure Linux VM with Ubuntu 14.04.
  • Microsoft Visual Studio.Microsoft Visual Studio.
  • Creación de un espacio de nombres de Event Hubs y un centro de eventos.Create an Event Hubs namespace and an event hub. Use 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.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. Obtenga el valor de la clave de acceso para el centro de eventos siguiendo las instrucciones del artículo: Obtenga la cadena de conexión.Get the value of access key for the event hub by following instructions from the article: Get connection string. Utilice la clave de acceso en el código que escriba más adelante en este tutorial.You use the access key in the code you write later in this tutorial. El nombre de la clave predeterminada es: RootManageSharedAccessKey.The default key name is: RootManageSharedAccessKey.

Escritura de código para enviar mensajes a Event HubsWrite code to send messages to Event Hubs

En esta sección se muestra cómo se escribe una aplicación en C para enviar eventos al centro de eventos.In this section shows how to write a C app to send events to your event hub. El código usa la biblioteca Proton AMQP del proyecto Apache Qpid.The code uses the Proton AMQP library from the Apache Qpid project. Esto es parecido a usar temas y colas de Service Bus con AMQP desde C como se muestra en este ejemplo.This is analogous to using Service Bus queues and topics with AMQP from C as shown in this sample. Para más información, consulte la documentación de Qpid Proton.For more information, see the Qpid Proton documentation.

  1. En la página Qpid AMQP Messenger, siga las instrucciones para instalar Qpid Proton según su entorno.From the Qpid AMQP Messenger page, follow the instructions to install Qpid Proton, depending on your environment.

  2. Para compilar la biblioteca Proton, instale los paquetes siguientes:To compile the Proton library, install the following packages:

    sudo apt-get install build-essential cmake uuid-dev openssl libssl-dev
    
  3. Descargue la biblioteca de Qpid Proton y extráigala; por ejemplo:Download the Qpid Proton library, and extract it, e.g.:

    wget https://archive.apache.org/dist/qpid/proton/0.7/qpid-proton-0.7.tar.gz
    tar xvfz qpid-proton-0.7.tar.gz
    
  4. Cree un directorio de compilación, compile y realice la instalación:Create a build directory, compile and install:

    cd qpid-proton-0.7
    mkdir build
    cd build
    cmake -DCMAKE_INSTALL_PREFIX=/usr ..
    sudo make install
    
  5. En su directorio de trabajo, cree un nuevo archivo denominado sender.c con el siguiente código.In your work directory, create a new file called sender.c with the following code. No olvide reemplazar los valores de nombre/clave de SAS, el nombre del centro de eventos y del espacio de nombres.Remember to replace the values for your SAS key/name, event hub name, and namespace. También debe sustituir una versión con codificación URL de la clave para la regla SendRule creada anteriormente.You must also substitute a URL-encoded version of the key for the SendRule created earlier. Puede codificar con URL aquí.You can URL-encode it here.

    #include "proton/message.h"
    #include "proton/messenger.h"
    
    #include <getopt.h>
    #include <proton/util.h>
    #include <sys/time.h>
    #include <stddef.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    #define check(messenger)                                                     \
      {                                                                          \
        if(pn_messenger_errno(messenger))                                        \
        {                                                                        \
          printf("check\n");                                                     \
          die(__FILE__, __LINE__, pn_error_text(pn_messenger_error(messenger))); \
        }                                                                        \
      }
    
    pn_timestamp_t time_now(void)
    {
      struct timeval now;
      if (gettimeofday(&now, NULL)) pn_fatal("gettimeofday failed\n");
      return ((pn_timestamp_t)now.tv_sec) * 1000 + (now.tv_usec / 1000);
    }  
    
    void die(const char *file, int line, const char *message)
    {
      printf("Dead\n");
      fprintf(stderr, "%s:%i: %s\n", file, line, message);
      exit(1);
    }
    
    int sendMessage(pn_messenger_t * messenger) {
        char * address = (char *) "amqps://{SAS Key Name}:{SAS key}@{namespace name}.servicebus.windows.net/{event hub name}";
        char * msgtext = (char *) "Hello from C!";
    
        pn_message_t * message;
        pn_data_t * body;
        message = pn_message();
    
        pn_message_set_address(message, address);
        pn_message_set_content_type(message, (char*) "application/octect-stream");
        pn_message_set_inferred(message, true);
    
        body = pn_message_body(message);
        pn_data_put_binary(body, pn_bytes(strlen(msgtext), msgtext));
    
        pn_messenger_put(messenger, message);
        check(messenger);
        pn_messenger_send(messenger, 1);
        check(messenger);
    
        pn_message_free(message);
    }
    
    int main(int argc, char** argv) {
        printf("Press Ctrl-C to stop the sender process\n");
    
        pn_messenger_t *messenger = pn_messenger(NULL);
        pn_messenger_set_outgoing_window(messenger, 1);
        pn_messenger_start(messenger);
    
        while(true) {
            sendMessage(messenger);
            printf("Sent message\n");
            sleep(1);
        }
    
        // release messenger resources
        pn_messenger_stop(messenger);
        pn_messenger_free(messenger);
    
        return 0;
    }
    
  6. Compile el archivo, suponiendo que gcc:Compile the file, assuming gcc:

    gcc sender.c -o sender -lqpid-proton
    

    Nota

    En este código se usa una ventana de salida de 1 para forzar que los mensajes salgan tan pronto como sea posible.This code uses an outgoing window of 1 to force the messages out as soon as possible. Se recomienda que la aplicación pruebe con los mensajes por lotes para aumentar el rendimiento.It is recommended that your application try to batch messages to increase throughput. Consulte la página Qpid AMQP Messenger para más información sobre cómo usar la biblioteca de Qpid Proton en este y otros entornos y desde las plataformas para las que se proporcionan enlaces (actualmente, Perl, PHP, Python y Ruby).See the Qpid AMQP Messenger page for information about how to use the Qpid Proton library in this and other environments, and from platforms for which bindings are provided (currently Perl, PHP, Python, and Ruby).

Ejecute la aplicación para enviar mensajes al centro de eventos.Run the application to send messages to the event hub.

Felicidades.Congratulations! Ha enviado mensajes a un centro de eventos.You have now sent messages to an event hub.

Pasos siguientesNext steps

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