Introducción a los temas y las suscripciones de Azure Service Bus

En este artículo de inicio rápido se muestra cómo enviar mensajes a un tema de Service Bus y recibir mensajes de una suscripción a ese tema mediante la biblioteca Azure.Messaging.ServiceBus de .NET.

En este inicio rápido, hará lo siguiente:

  1. Creación de un espacio de nombres de Service Bus mediante Azure Portal
  2. Creación de un tema de Service Bus mediante Azure Portal.
  3. Creación de una suscripción de Service Bus a dicho tema mediante Azure Portal.
  4. Escriba una aplicación de consola de .NET Core para enviar un conjunto de mensajes al tema.
  5. Escriba una aplicación de consola de .NET Core para recibir esos mensajes de la suscripción.

Nota

En este inicio rápido se proporcionan instrucciones detalladas para un escenario sencillo de envío de un lote de mensajes a un tema de Service Bus y recepción de esos mensajes desde una suscripción del tema. Puede encontrar más ejemplos pregenerados de .NET para Azure Service Bus en el repositorio del SDK de Azure para .NET en GitHub.

Prerrequisitos

Si no está familiarizado con el servicio, consulte la información general sobre Service Bus antes de seguir este artículo de inicio rápido.

  • Suscripción de Azure. Para usar los servicios de Azure, entre los que se incluye Azure Service Bus, se necesita una suscripción. Si no se dispone de una cuenta de Azure, es posible registrarse para obtener una evaluación gratuita, o bien usar las ventajas que disfrutan los suscriptores MSDN al crear una cuenta.
  • Microsoft Visual Studio 2019. La biblioteca cliente de Azure Service Bus usa las nuevas características que se introdujeron en C# 8.0. Aunque puede seguir usando la biblioteca con versiones anteriores de C#, la nueva sintaxis no estará disponible. Para usar la sintaxis completa, se recomienda realizar la compilación con el SDK de .NET Core 3.0 o superior y la versión de lenguaje establecida en latest. Si usa Visual Studio, las versiones anteriores a Visual Studio 2019 no son compatibles con las herramientas necesarias para compilar proyectos de C# 8.0. Visual Studio 2019, incluida la edición gratuita Community, se puede descargar aquí.

Creación de un espacio de nombres en Azure Portal

Para empezar a usar entidades de mensajería de Service Bus en Azure, primero hay que crear un espacio de nombres con un nombre que sea único en Azure. Un espacio de nombres proporciona un contenedor con un ámbito para el desvío de recursos de Service Bus en la aplicación.

Para crear un espacio de nombres:

  1. Inicie sesión en el Portal de Azure

  2. En el panel de navegación izquierdo del portal, seleccione sucesivamente + Crear un recurso, Integración y Service Bus.

    Imagen que muestra la selección de Crear un recurso, Integración y, posteriormente, Service Bus en el menú.

  3. En la pestaña Datos básicos de la página Crear espacio de nombres, siga estos pasos:

    1. En Suscripción, elija la suscripción de Azure en la que se va a crear el espacio de nombres.

    2. En Grupo de recursos, elija un grupo de recursos existente en el que residirá el espacio de nombres o cree uno.

    3. Escriba nombre para el espacio de nombres. El sistema realiza la comprobación automáticamente para ver si el nombre está disponible. Para obtener una lista de las reglas para asignar nombres a los espacios de nombres, consulte Creación de API REST de espacio de nombres.

    4. En Ubicación, elija la región donde se debe hospedar el espacio de nombres.

    5. En Plan de tarifa, seleccione el plan de tarifa (Básico, Estándar o Prémium) del espacio de nombres. Para este inicio rápido, seleccione Estándar.

      Si desea usar temas y suscripciones, elija Estándar o Premium. El plan de tarifas Básico no admite temas o suscripciones.

      Si ha seleccionado el plan de tarifa Prémium, especifique el número de unidades de mensajería. El plan Premium proporciona aislamiento de recursos en el nivel de CPU y memoria para que cada carga de trabajo se ejecute de forma aislada. Este contenedor de recursos se llama unidad de mensajería. A cada espacio de nombres prémium se le asigna al menos una unidad de mensajería. Puede seleccionar 1, 2 o 4 unidades de mensajería para cada espacio de nombres Premium de Service Bus. Para más información, consulte Mensajería prémium de Service Bus.

    6. Seleccione Revisar + crear. El sistema crea ahora el espacio de nombres del servicio y lo habilita. Es posible que tenga que esperar algunos minutos mientras el sistema realiza el aprovisionamiento de los recursos para la cuenta.

      Imagen que muestra la página Crear un espacio de nombres

    7. En la página Revisar y crear, examine la configuración y seleccione Crear.

  4. Seleccione Ir al recurso en la página de implementación.

    Imagen que muestra la página implementación correcta con el vínculo Ir al recurso.

  5. Verá la página principal del espacio de nombres de Service Bus.

    Imagen que muestra la página principal del espacio de nombres de Service Bus creado.

Obtención de la cadena de conexión

La creación un espacio de nombres genera automáticamente una directiva de firma de acceso compartido (SAS) inicial con claves principal y secundaria, y cadenas de conexión principal y secundaria en el que ambas conceden control total sobre todos los aspectos del espacio de nombres. Para obtener información acerca de cómo crear reglas adicionales con derechos más restringidos para remitentes y destinatarios normales, consulte Autenticación y autorización de Service Bus.

Para copiar la cadena de conexión principal del espacio de nombres, siga estos pasos:

  1. En la página Espacio de nombres de Service Bus, seleccione Directivas de acceso compartido en el menú de la izquierda.

  2. En la página Directivas de acceso compartido, seleccione RootManageSharedAccessKey.

    La captura de pantalla muestra la ventana de directivas de acceso compartido con una de ellas resaltada.

  3. En la ventana Directiva: RootManageSharedAccessKey, haga clic en el botón Copiar que hay junto a Cadena de conexión principal para copiar la cadena de conexión en el portapapeles para su uso posterior. Pegue este valor en el Bloc de notas o cualquier otra ubicación temporal.

    La captura de pantalla muestra una directiva de SAS llamada RootManageSharedAccessKey, que incluye claves y cadenas de conexión.

    Puede usar esta página para copiar la clave principal, la clave secundaria y la cadena de conexión secundaria.

Creación de un tema mediante Azure Portal

  1. En la página Espacio de nombres de Service Bus, seleccione Temas en el menú izquierdo.

  2. En la barra de herramientas, seleccione + Tema.

  3. Escriba un nombre para el tema. Deje las restantes opciones con sus valores predeterminados.

  4. Seleccione Crear.

    Imagen que muestra la página Crear un tema.

Creación de una suscripción al tema

  1. Seleccione el tema que creó en la sección anterior.

    Imagen que muestra la selección del tema de la lista de temas.

  2. En la página Tema de Service Bus, seleccione Suscripción en la barra de herramientas.

    Imagen que muestra el botón Agregar suscripción.

  3. En la página Crear suscripción, siga estos pasos:

    1. Escriba S1 como nombre de la suscripción.

    2. Escriba 3 en Max delivery count (Número máximo de entregas).

    3. Luego, seleccione Create (Crear) para guardar la suscripción.

      Imagen que muestra la página Crear suscripción.

Importante

Anote la cadena de conexión al espacio de nombres, el nombre del tema y el nombre de la suscripción. Los usará más adelante en este tutorial.

Envío de mensajes al tema

En esta sección se muestra cómo crear una aplicación de consola de .NET Core para mensajes a un tema de Service Bus.

Creación de una aplicación de consola

  1. Inicie Visual Studio 2019.
  2. Seleccione Crear un proyecto.
  3. En el cuadro de diálogo Crear un nuevo proyecto, siga estos pasos: Si no ve este cuadro de diálogo, seleccione Archivo en el menú, seleccione Nuevo y, después, seleccione Proyecto.
    1. Seleccione C# como lenguaje de programación.

    2. Seleccione Consola como tipo de aplicación.

    3. Seleccione Aplicación de consola en la lista de resultados.

    4. Después, seleccione Siguiente.

      Imagen que muestra el cuadro de diálogo Crear un nuevo proyecto con C# y Consola seleccionados

  4. Escriba TopicSender como nombre del proyecto, ServiceBusTopicQuickStart como nombre de la solución y, a continuación, seleccione Siguiente.
  5. En la página Información adicional, seleccione Crear para crear la solución y el proyecto.

Agregar el paquete NuGet de Service Bus

  1. Seleccione Herramientas > Administrador de paquetes NuGet > Consola del Administrador de paquetes en el menú.

  2. Ejecute el siguiente comando para instalar el paquete NuGet Azure.Messaging.ServiceBus:

    Install-Package Azure.Messaging.ServiceBus
    

Incorporación de código para enviar mensajes al tema

  1. En Program.cs, agregue las siguientes instrucciones using en la parte superior de la definición del espacio de nombres, antes de la declaración de clase.

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
  2. Dentro de la clase Program, declare las siguientes propiedades, justo antes del método Main. Reemplace <NAMESPACE CONNECTION STRING> por la cadena de conexión del espacio de nombres de Service Bus. Y reemplace <TOPIC NAME> por el nombre del tema de Service Bus.

    // connection string to your Service Bus namespace
    static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
    // name of your Service Bus topic
    static string topicName = "<TOPIC NAME>";
    
    // the client that owns the connection and can be used to create senders and receivers
    static ServiceBusClient client;
    
    // the sender used to publish messages to the topic
    static ServiceBusSender sender;
    
    // number of messages to be sent to the topic
    private const int numOfMessages = 3;
    
  3. Reemplace el código del archivo Program.cs por el código siguiente. Estos son los pasos importantes del código.

    1. Crea un objeto ServiceBusClient mediante la cadena de conexión al espacio de nombres.
    2. Invoca al método CreateSender en el objeto ServiceBusClient para crear un objeto ServiceBusSender para el tema específico de Service Bus.
    3. Crea un objeto ServiceBusMessageBatch mediante ServiceBusSender.CreateMessageBatchAsync.
    4. Agrega mensajes al lote mediante ServiceBusMessageBatch.TryAddMessage.
    5. Envía el lote de mensajes al tema de Service Bus mediante el método ServiceBusSender.SendMessagesAsync.
    static async Task Main()
    {
        // The Service Bus client types are safe to cache and use as a singleton for the lifetime
        // of the application, which is best practice when messages are being published or read
        // regularly.
        //
        // Create the clients that we'll use for sending and processing messages.
        client = new ServiceBusClient(connectionString);
        sender = client.CreateSender(topicName);
    
        // create a batch 
        using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    
        for (int i = 1; i <= numOfMessages; i++)
        {
            // try adding a message to the batch
            if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
            {
                // if it is too large for the batch
                throw new Exception($"The message {i} is too large to fit in the batch.");
            }
        }
    
        try
        {
            // Use the producer client to send the batch of messages to the Service Bus topic
            await sender.SendMessagesAsync(messageBatch);
            Console.WriteLine($"A batch of {numOfMessages} messages has been published to the topic.");
        }
        finally
        {
            // Calling DisposeAsync on client types is required to ensure that network
            // resources and other unmanaged objects are properly cleaned up.
            await sender.DisposeAsync();
            await client.DisposeAsync();
        }
    
        Console.WriteLine("Press any key to end the application");
        Console.ReadKey();
    }
    
  4. Este es el aspecto que debería tener el archivo Program.cs:

    Para más información, consulte los comentarios del código.

    using System;
    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
    namespace TopicSender
    {
        class Program
        {
            // connection string to your Service Bus namespace
            static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
            // name of your Service Bus topic
            static string topicName = "<TOPIC NAME>";
    
            // the client that owns the connection and can be used to create senders and receivers
            static ServiceBusClient client;
    
            // the sender used to publish messages to the topic
            static ServiceBusSender sender;
    
            // number of messages to be sent to the topic
            private const int numOfMessages = 3;
    
            static async Task Main()
            {
                // The Service Bus client types are safe to cache and use as a singleton for the lifetime
                // of the application, which is best practice when messages are being published or read
                // regularly.
                //
                // Create the clients that we'll use for sending and processing messages.
                client = new ServiceBusClient(connectionString);
                sender = client.CreateSender(topicName);
    
                // create a batch 
                using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    
                for (int i = 1; i <= numOfMessages; i++)
                {
                    // try adding a message to the batch
                    if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
                    {
                        // if it is too large for the batch
                        throw new Exception($"The message {i} is too large to fit in the batch.");
                    }
                }
    
                try
                {
                    // Use the producer client to send the batch of messages to the Service Bus topic
                    await sender.SendMessagesAsync(messageBatch);
                    Console.WriteLine($"A batch of {numOfMessages} messages has been published to the topic.");
                }
                finally
                {
                    // Calling DisposeAsync on client types is required to ensure that network
                    // resources and other unmanaged objects are properly cleaned up.
                    await sender.DisposeAsync();
                    await client.DisposeAsync();
                }
    
                Console.WriteLine("Press any key to end the application");
                Console.ReadKey();
            }
        }
    }    
    
  5. Reemplace <NAMESPACE CONNECTION STRING> por la cadena de conexión del espacio de nombres de Service Bus. Y reemplace <TOPIC NAME> por el nombre del tema de Service Bus.

  6. Compile el proyecto y asegúrese de que no hay errores.

  7. Ejecute el programa y espere el mensaje de confirmación.

    A batch of 3 messages has been published to the topic
    
  8. En Azure Portal, haga lo siguiente:

    1. Vaya al espacio de nombres de Service Bus.

    2. En la página Información general, en el panel inferior central, cambie a la pestaña Temas y seleccione el tema de Service Bus. En el ejemplo siguiente, es mytopic.

      Selección de tema

    3. En la página Tema de Service Bus, en el gráfico Mensajes de la sección Métricas inferior, puede ver que hay tres mensajes entrantes para la cola. Si no ve el valor, espere unos minutos y actualice la página para ver el gráfico actualizado.

      Mensajes enviados al tema

    4. Seleccione la suscripción en el panel inferior. En el ejemplo siguiente, es S1. En la página Suscripción de Service Bus, verá el Recuento de mensajes activos como 3. La suscripción ha recibido los tres mensajes que ha enviado al tema, pero ningún receptor los ha recogido todavía.

      Mensajes recibidos en la suscripción

Recepción de mensajes de una suscripción

En esta sección, creará una aplicación de consola de .NET Core que recibe mensajes de la suscripción al tema de Service Bus.

Creación de un proyecto para el destinatario

  1. En la ventana del Explorador de soluciones, haga clic con el botón derecho en la solución ServiceBusTopicQuickStart, haga clic en Agregar y seleccione Nuevo proyecto.
  2. Seleccione Aplicación de consola y seleccione Siguiente.
  3. Escriba SubscriptionReceiver como Nombre del proyecto y seleccione Siguiente.
  4. En la página Información adicional, seleccione Crear.
  5. En la ventana Explorador de soluciones, haga clic con el botón derecho en SubscriptionReceiver y seleccione Establecer como proyecto de inicio.

Agregar el paquete NuGet de Service Bus

  1. Seleccione Herramientas > Administrador de paquetes NuGet > Consola del Administrador de paquetes en el menú.

  2. En la ventana Consola del Administrador de paquetes, confirme que SubscriptionReceiver esté seleccionado para el Proyecto predeterminado. Si no es así, use la lista desplegable para seleccionar SubscriptionReceiver.

    Imagen que muestra la selección del proyecto SubscriptionReceiver en la ventana de la consola del administrador de paquetes.

  3. Ejecute el siguiente comando para instalar el paquete NuGet Azure.Messaging.ServiceBus:

    Install-Package Azure.Messaging.ServiceBus
    

Adición de código para recibir mensajes de la suscripción

  1. En Program.cs, agregue las siguientes instrucciones using en la parte superior de la definición del espacio de nombres, antes de la declaración de clase.

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
  2. Dentro de la clase Program, declare las siguientes propiedades, justo antes del método Main. Reemplace los marcadores de posición por los valores correctos:

    • <NAMESPACE CONNECTION STRING> por la cadena de conexión del espacio de nombres de Service Bus.
    • <TOPIC NAME> por el nombre del tema de Service Bus.
    • <SERVICE BUS - TOPIC SUBSCRIPTION NAME> por el nombre de la suscripción al tema.
    // connection string to your Service Bus namespace
    static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
    // name of the Service Bus topic
    static string topicName = "<SERVICE BUS TOPIC NAME>";
    
    // name of the subscription to the topic
    static string subscriptionName = "<SERVICE BUS - TOPIC SUBSCRIPTION NAME>";
    
    // the client that owns the connection and can be used to create senders and receivers
    static ServiceBusClient client;
    
    // the processor that reads and processes messages from the subscription
    static ServiceBusProcessor processor;    
    
  3. Agregue los métodos siguientes a la clase Program para controlar los mensajes y los errores recibidos.

    // handle received messages
    static async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine($"Received: {body} from subscription: {subscriptionName}");
    
        // complete the message. messages is deleted from the subscription. 
        await args.CompleteMessageAsync(args.Message);
    }
    
    // handle any errors when receiving messages
    static Task ErrorHandler(ProcessErrorEventArgs args)
    {
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
  4. Reemplace el código del archivo Program.cs por el código siguiente. Estos son los pasos importantes del código:

    1. Crea un objeto ServiceBusClient mediante la cadena de conexión al espacio de nombres.
    2. Invoca al método CreateProcessor en el objeto ServiceBusClient para crear un objeto ServiceBusProcessor para la cola de Service Bus especificada.
    3. Especifica los controladores para los eventos ProcessMessageAsync y ProcessErrorAsync del objeto ServiceBusProcessor.
    4. Inicia el procesamiento de mensajes; para ello, invoca el método StartProcessingAsync en el objeto ServiceBusProcessor.
    5. Cuando el usuario presiona una tecla para finalizar el procesamiento, invoca el método StopProcessingAsync en el objeto ServiceBusProcessor.

    Para más información, consulte los comentarios del código.

    static async Task Main()
    {
        // The Service Bus client types are safe to cache and use as a singleton for the lifetime
        // of the application, which is best practice when messages are being published or read
        // regularly.
        //
        // Create the clients that we'll use for sending and processing messages.
        client = new ServiceBusClient(connectionString);
    
        // create a processor that we can use to process the messages
        processor = client.CreateProcessor(topicName, subscriptionName, new ServiceBusProcessorOptions());
    
        try
        {
            // add handler to process messages
            processor.ProcessMessageAsync += MessageHandler;
    
            // add handler to process any errors
            processor.ProcessErrorAsync += ErrorHandler;
    
            // start processing 
            await processor.StartProcessingAsync();
    
            Console.WriteLine("Wait for a minute and then press any key to end the processing");
            Console.ReadKey();
    
            // stop processing 
            Console.WriteLine("\nStopping the receiver...");
            await processor.StopProcessingAsync();
            Console.WriteLine("Stopped receiving messages");
        }
        finally
        {
            // Calling DisposeAsync on client types is required to ensure that network
            // resources and other unmanaged objects are properly cleaned up.
            await processor.DisposeAsync();
            await client.DisposeAsync();
        }
    }    
    
  5. Este es el aspecto que debería tener Program.cs:

    using System;
    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
    namespace SubscriptionReceiver
    {
        class Program
        {
            // connection string to your Service Bus namespace
            static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
            // name of the Service Bus topic
            static string topicName = "<SERVICE BUS TOPIC NAME>";
    
            // name of the subscription to the topic
            static string subscriptionName = "<SERVICE BUS - TOPIC SUBSCRIPTION NAME>";
    
            // the client that owns the connection and can be used to create senders and receivers
            static ServiceBusClient client;
    
            // the processor that reads and processes messages from the subscription
            static ServiceBusProcessor processor;
    
            // handle received messages
            static async Task MessageHandler(ProcessMessageEventArgs args)
            {
                string body = args.Message.Body.ToString();
                Console.WriteLine($"Received: {body} from subscription: {subscriptionName}");
    
                // complete the message. messages is deleted from the subscription. 
                await args.CompleteMessageAsync(args.Message);
            }
    
            // handle any errors when receiving messages
            static Task ErrorHandler(ProcessErrorEventArgs args)
            {
                Console.WriteLine(args.Exception.ToString());
                return Task.CompletedTask;
            }
    
            static async Task Main()
            {
                // The Service Bus client types are safe to cache and use as a singleton for the lifetime
                // of the application, which is best practice when messages are being published or read
                // regularly.
                //
                // Create the clients that we'll use for sending and processing messages.
                client = new ServiceBusClient(connectionString);
    
                // create a processor that we can use to process the messages
                processor = client.CreateProcessor(topicName, subscriptionName, new ServiceBusProcessorOptions());
    
                try
                {
                    // add handler to process messages
                    processor.ProcessMessageAsync += MessageHandler;
    
                    // add handler to process any errors
                    processor.ProcessErrorAsync += ErrorHandler;
    
                    // start processing 
                    await processor.StartProcessingAsync();
    
                    Console.WriteLine("Wait for a minute and then press any key to end the processing");
                    Console.ReadKey();
    
                    // stop processing 
                    Console.WriteLine("\nStopping the receiver...");
                    await processor.StopProcessingAsync();
                    Console.WriteLine("Stopped receiving messages");
                }
                finally
                {
                    // Calling DisposeAsync on client types is required to ensure that network
                    // resources and other unmanaged objects are properly cleaned up.
                    await processor.DisposeAsync();
                    await client.DisposeAsync();
                }
            }
        }
    }
    
  6. Reemplace los marcadores de posición por los valores correctos:

    • <NAMESPACE CONNECTION STRING> por la cadena de conexión del espacio de nombres de Service Bus.
    • <TOPIC NAME> por el nombre del tema de Service Bus.
    • <SERVICE BUS - TOPIC SUBSCRIPTION NAME> por el nombre de la suscripción al tema.
  7. Compile el proyecto y asegúrese de que no hay errores.

  8. Ejecute la aplicación del destinatario. Debería ver los mensajes recibidos. Presione cualquier tecla para detener el receptor y la aplicación.

    Wait for a minute and then press any key to end the processing
    Received: Message 1 from subscription: S1
    Received: Message 2 from subscription: S1
    Received: Message 3 from subscription: S1
    
    Stopping the receiver...
    Stopped receiving messages
    
  9. Vuelva a consultar el portal.

    • En la página Tema de Service Bus, en el gráfico Mensajes, podrá ver tres mensajes entrantes y tres mensajes salientes. Si no ve estos números, espere unos minutos y actualice la página para ver el gráfico actualizado.

      Mensajes enviados y recibidos

    • En la página Service Bus Subscription (Suscripción de Service Bus), verá el Recuento de mensajes activos como cero. Esto se debe a que un receptor ha recibido mensajes de esta suscripción y ha completado los mensajes.

      Recuento de mensajes activos final en la suscripción

Pasos siguientes

Consulte la documentación y los ejemplos siguientes: