Compartir a través de


Envío de mensajes a las colas de Azure Service Bus (Java) y recepción desde ellas

En este inicio rápido se proporcionan instrucciones paso a paso para un escenario sencillo de enviar mensajes a una cola de Service Bus y recibirlos. Cree una aplicación de Java para enviar y recibir mensajes de una cola de Azure Service Bus. Puede encontrar ejemplos de Java creados previamente para Azure Service Bus en el repositorio de Azure SDK para Java en GitHub.

Sugerencia

Si está trabajando con recursos de Azure Service Bus en una aplicación spring, se recomienda considerar Spring Cloud Azure. Spring Cloud Azure es un proyecto de código abierto que proporciona una integración perfecta de Spring con los servicios de Azure. Para más información sobre Spring Cloud Azure y para ver un ejemplo con Service Bus, consulte Spring Cloud Stream con Azure Service Bus.

Requisitos previos

Creación de un espacio de nombres en Azure Portal

Para empezar a usar entidades de mensajería de Service Bus en Azure, cree un espacio de nombres con un nombre único en Azure. Un espacio de nombres proporciona un contenedor de ámbito para los recursos de Service Bus, como colas y temas, en la aplicación.

Para crear un espacio de nombres:

  1. Inicie sesión en Azure Portal.

  2. Seleccione el menú flotante de la parte superior izquierda y vaya a la página Todos los servicios.

  3. En la barra de navegación izquierda, seleccione Integración.

  4. Desplácese hacia abajo hasta Servicios de mensajería>Service Bus y seleccione Crear.

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

  5. En la pestaña Aspectos 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. Para Grupo de recursos, elija un grupo de recursos existente o cree uno nuevo.

    3. Escriba un nombre de espacio de nombres que cumpla las siguientes convenciones de nomenclatura:

      • El nombre debe ser único en Azure. El sistema realiza la comprobación automáticamente para ver si el nombre está disponible.
      • La longitud del nombre es de 6 caracteres como mínimo y 50 como máximo.
      • El nombre solo puede contener letras, números y guiones -.
      • El nombre debe comenzar con una letra y terminar con una letra o un número.
      • El nombre no termina con -sb ni -mgmt.
    4. En Ubicación, elija la región para 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 selecciona Nivel Premium , puede habilitar la replicación geográfica para el espacio de nombres. La característica de replicación geográfica garantiza que los metadatos y los datos de un espacio de nombres se repliquen continuamente desde una región primaria a una o varias regiones secundarias.

      Importante

      Si desea usar temas y suscripciones, elija Estándar o Premium. Los temas y las suscripciones no se admiten en el plan de tarifa Básico.

      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, 4, 8 o 16 unidades de mensajería para cada espacio de nombres prémium de Service Bus. Para más información, consulte Nivel de mensajería Premium de Service Bus.

    6. En la parte inferior de la página, seleccione Revisar y crear.

      Captura de pantalla 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.

  6. Una vez que la implementación del recurso se haya realizado correctamente, seleccione Ir al recurso en la página de implementación.

    Captura de pantalla que muestra la página de implementación exitosa con el enlace Ir al recurso.

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

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

Creación de colas en Azure Portal

  1. En la página Espacio de nombres de Service Bus, expanda Entidades en el menú de navegación a la izquierda y seleccione Colas.

  2. En la página Colas, en la barra de herramientas, seleccione + Cola.

  3. Escriba un nombre para la cola. Deje los demás valores con sus valores predeterminados.

  4. Selecciona Crear.

    Captura de pantalla que muestra la página Crear cola.

Autenticación de la aplicación en Azure

En este artículo se muestran dos maneras de conectarse a Azure Service Bus: sin contraseña y cadena de conexión.

La primera opción muestra cómo usar la entidad de seguridad en Microsoft Entra ID y el control de acceso basado en rol (RBAC) para conectarse a un espacio de nombres de Service Bus. No es necesario preocuparse por tener una cadena de conexión codificada de forma rígida en el código, en un archivo de configuración o en un almacenamiento seguro como Azure Key Vault.

La segunda opción muestra cómo usar una cadena de conexión para conectarse a un espacio de nombres de Service Bus. Si no está familiarizado con Azure, es posible que encuentre la opción de cadena de conexión más fácil de seguir. Se recomienda usar la opción sin contraseña en aplicaciones reales y entornos de producción. Para más información, consulte Autenticación y autorización de Service Bus. Para más información sobre la autenticación sin contraseña, consulte Autenticación de aplicaciones .NET.

Asignación de roles al usuario de Microsoft Entra

Al desarrollar localmente, asegúrese de que la cuenta de usuario que se conecta a Azure Service Bus tiene los permisos correctos. Necesita el rol Propietario de datos de Azure Service Bus para enviar y recibir mensajes. Para asignarse este rol, necesita el rol Administrador de acceso de usuario u otro rol que incluya la Microsoft.Authorization/roleAssignments/write acción.

Puede asignar roles RBAC de Azure a un usuario mediante Azure Portal, la CLI de Azure o Azure PowerShell. Para más información sobre los ámbitos disponibles para las asignaciones de roles, consulte Descripción del ámbito de RBAC de Azure.

En el ejemplo siguiente se asigna el rol Azure Service Bus Data Owner a la cuenta de usuario, que proporciona un acceso completo a los recursos de Azure Service Bus. En un escenario real, siga el principio de privilegios mínimos para conceder a los usuarios solo los permisos mínimos necesarios para un entorno de producción más seguro.

Roles integrados de Azure para Azure Service Bus

En el caso de Azure Service Bus, la administración de los espacios de nombres y de todos los recursos relacionados mediante Azure Portal y la API de administración de recursos de Azure, ya se ha protegido mediante el modelo de Azure RBAC. Azure proporciona los siguientes roles integrados de Azure para autorizar el acceso a un espacio de nombres de Service Bus:

Si desea crear un rol personalizado, consulte Derechos necesarios para las operaciones de Service Bus.

Incorporación de un usuario de Microsoft Entra al rol Propietario de Azure Service Bus

Asigne el rol Propietario de datos de Azure Service Bus al nombre de usuario de Microsoft Entra en el nivel de espacio de nombres de Service Bus. Esta configuración permite que una aplicación que se ejecute en el contexto de la cuenta de usuario envíe mensajes a una cola o a un tema. Puede recibir mensajes de una cola o de la suscripción de un tema.

Importante

En la mayoría de los casos, la asignación de roles tardará uno o dos minutos en propagarse en Azure. En raras ocasiones, puede tardar hasta ocho minutos. Si recibe errores de autenticación al ejecutar por primera vez el código, espere unos instantes e inténtelo de nuevo.

  1. Si no tiene abierta la página Espacio de nombres de Service Bus en Azure-Portal, busque el espacio de nombres de Service Bus mediante la barra de búsqueda principal o el panel de navegación izquierdo.

  2. En la página Información general , seleccione Control de acceso (IAM) en el menú de la izquierda.

  3. En la página Control de acceso (IAM), seleccione la pestaña Asignación de roles.

  4. Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles.

    Una captura de pantalla que muestra cómo asignar un rol.

  5. Puede usar el cuadro de búsqueda para filtrar los resultados por el rol deseado. En este ejemplo, busque Azure Service Bus Data Owner y seleccione el resultado coincidente. Después, haga clic en Siguiente.

  6. En la pestaña Asignar acceso a, seleccione Usuario, grupo o entidad de servicio y, a continuación, elija + Seleccionar miembros.

  7. En el cuadro de diálogo, busque el nombre de usuario de Microsoft Entra (normalmente su dirección de correo electrónico de user@domain) y, a continuación, elija Seleccionar en la parte inferior del cuadro de diálogo.

  8. Seleccione Revisar y asignar para ir a la página final y, a continuación, de nuevo Revisar y asignar para completar el proceso.

mensajes a una cola

En esta sección, creará un proyecto de consola de Java y agregará código para enviar mensajes a la cola que creó anteriormente.

Creación de un proyecto de consola de Java

Cree un proyecto de Java mediante Eclipse o la herramienta que prefiera.

Configuración de la aplicación para usar Service Bus

Agregue referencias a las bibliotecas de Azure Core y Azure Service Bus.

Si usa Eclipse y ha creado una aplicación de consola de Java, convierta el proyecto de Java en maven: haga clic con el botón derecho en el proyecto en la ventana Explorador de paquetes . Seleccione Configurar>convertir en proyecto de Maven. Luego, agregue dependencias a estas dos bibliotecas, tal como se muestra en el ejemplo siguiente.

Actualice el archivo pom.xml para agregar dependencias a Azure Service Bus y paquetes de identidad de Azure.

    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-messaging-servicebus</artifactId>
            <version>7.13.3</version>
        </dependency>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-identity</artifactId>
            <version>1.8.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

Incorporación de código para enviar mensajes a la cola

  1. Agregue las siguientes instrucciones import al principio del archivo Java.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. En la clase , defina variables para contener la cadena de conexión y el nombre de la cola.

    static String queueName = "<QUEUE NAME>";
    

    Importante

    Reemplace <QUEUE NAME> por el nombre de la cola.

  3. Agregue un método denominado sendMessage a la clase para enviar un mensaje a la cola.

    Importante

    Reemplace NAMESPACENAME por el nombre del espacio de nombres de Service Bus.

    static void sendMessage()
    {
        // create a token using the default Azure credential
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .sender()
                .queueName(queueName)
                .buildClient();
    
        // send one message to the queue
        senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
        System.out.println("Sent a single message to the queue: " + queueName);
    }
    
    
  4. Agregue un método denominado createMessages a la clase para crear una lista de mensajes. Normalmente, estos mensajes se obtienen de distintas partes de la aplicación. En este ejemplo, se usa una lista de mensajes de ejemplo.

    static List<ServiceBusMessage> createMessages()
    {
        // create a list of messages and return it to the caller
        ServiceBusMessage[] messages = {
                new ServiceBusMessage("First message"),
                new ServiceBusMessage("Second message"),
                new ServiceBusMessage("Third message")
        };
        return Arrays.asList(messages);
    }
    
  5. Agregue un método denominado sendMessageBatch para enviar mensajes a la cola que ha creado. Este método crea un ServiceBusSenderClient para la cola, invoca el método createMessages para obtener la lista de mensajes, prepara uno o varios lotes y envía los lotes a la cola.

    Importante

    Reemplace NAMESPACENAME por el nombre del espacio de nombres de Service Bus.

    static void sendMessageBatch()
    {
        // create a token using the default Azure credential
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .sender()
                .queueName(queueName)
                .buildClient();
    
        // Creates an ServiceBusMessageBatch where the ServiceBus.
        ServiceBusMessageBatch messageBatch = senderClient.createMessageBatch();
    
        // create a list of messages
        List<ServiceBusMessage> listOfMessages = createMessages();
    
        // We try to add as many messages as a batch can fit based on the maximum size and send to Service Bus when
        // the batch can hold no more messages. Create a new batch for next set of messages and repeat until all
        // messages are sent.
        for (ServiceBusMessage message : listOfMessages) {
            if (messageBatch.tryAddMessage(message)) {
                continue;
            }
    
            // The batch is full, so we create a new batch and send the batch.
            senderClient.sendMessages(messageBatch);
            System.out.println("Sent a batch of messages to the queue: " + queueName);
    
            // create a new batch
            messageBatch = senderClient.createMessageBatch();
    
            // Add that message that we couldn't before.
            if (!messageBatch.tryAddMessage(message)) {
                System.err.printf("Message is too large for an empty batch. Skipping. Max size: %s.", messageBatch.getMaxSizeInBytes());
            }
        }
    
        if (messageBatch.getCount() > 0) {
            senderClient.sendMessages(messageBatch);
            System.out.println("Sent a batch of messages to the queue: " + queueName);
        }
    
        //close the client
        senderClient.close();
    }
    

mensajes de una cola

En esta sección agregará código para recuperar mensajes de la cola.

  1. Agregue un método denominado receiveMessages para recibir mensajes de la cola. Este método crea un ServiceBusProcessorClient para la cola al especificar un controlador para procesar los mensajes y otro, para los errores. A continuación, inicia el procesador, espera unos segundos, imprime los mensajes que se reciben, y detiene y cierra el procesador.

    Importante

    • Reemplace NAMESPACENAME por el nombre del espacio de nombres de Service Bus.
    // handles received messages
    static void receiveMessages() throws InterruptedException
    {
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusProcessorClient processorClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .processor()
                .queueName(queueName)
                .processMessage(context -> processMessage(context))
                .processError(context -> processError(context))
                .buildProcessorClient();
    
        System.out.println("Starting the processor");
        processorClient.start();
    
        TimeUnit.SECONDS.sleep(10);
        System.out.println("Stopping and closing the processor");
        processorClient.close();
    }
    
  2. Agregue el método processMessage para procesar un mensaje recibido de la suscripción de Service Bus.

    private static void processMessage(ServiceBusReceivedMessageContext context) {
        ServiceBusReceivedMessage message = context.getMessage();
        System.out.printf("Processing message. Session: %s, Sequence #: %s. Contents: %s%n", message.getMessageId(),
            message.getSequenceNumber(), message.getBody());
    }
    
  3. Agregue el método processError para controlar los mensajes de error.

    private static void processError(ServiceBusErrorContext context) {
        System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n",
            context.getFullyQualifiedNamespace(), context.getEntityPath());
    
        if (!(context.getException() instanceof ServiceBusException)) {
            System.out.printf("Non-ServiceBusException occurred: %s%n", context.getException());
            return;
        }
    
        ServiceBusException exception = (ServiceBusException) context.getException();
        ServiceBusFailureReason reason = exception.getReason();
    
        if (reason == ServiceBusFailureReason.MESSAGING_ENTITY_DISABLED
            || reason == ServiceBusFailureReason.MESSAGING_ENTITY_NOT_FOUND
            || reason == ServiceBusFailureReason.UNAUTHORIZED) {
            System.out.printf("An unrecoverable error occurred. Stopping processing with reason %s: %s%n",
                reason, exception.getMessage());
        } else if (reason == ServiceBusFailureReason.MESSAGE_LOCK_LOST) {
            System.out.printf("Message lock lost for message: %s%n", context.getException());
        } else if (reason == ServiceBusFailureReason.SERVICE_BUSY) {
            try {
                // Choosing an arbitrary amount of time to wait until trying again.
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                System.err.println("Unable to sleep for period of time");
            }
        } else {
            System.out.printf("Error source %s, reason %s, message: %s%n", context.getErrorSource(),
                reason, context.getException());
        }
    }
    
  4. Actualice el método main para invocar los métodos sendMessage, sendMessageBatch y receiveMessages, y para iniciar InterruptedException.

    public static void main(String[] args) throws InterruptedException {
        sendMessage();
        sendMessageBatch();
        receiveMessages();
    }
    

Ejecutar la aplicación

  1. Si usa Eclipse, haga clic con el botón derecho en el proyecto, seleccione Exportar, expanda Java, seleccione Archivo JAR ejecutable y siga los pasos para crear un archivo JAR ejecutable.

  2. Si ha iniciado sesión en una cuenta de usuario diferente de la que agregó al rol Propietario de datos de Azure Service Bus , siga estos pasos. De lo contrario, vaya a ejecutar el archivo Jar en el paso siguiente.

    1. Instale la CLI de Azure en la máquina.

    2. Ejecute el siguiente comando de CLI para iniciar sesión en Azure. Use la misma cuenta de usuario que agregó al rol de propietario de datos de Azure Service Bus.

      az login
      
  3. Ejecute el archivo Jar con el siguiente comando.

    java -jar <JAR FILE NAME>
    
  4. Verá el resultado siguiente en la ventana de la consola:

    Sent a single message to the queue: myqueue
    Sent a batch of messages to the queue: myqueue
    Starting the processor
    Processing message. Session: 88d961dd801f449e9c3e0f8a5393a527, Sequence #: 1. Contents: Hello, World!
    Processing message. Session: e90c8d9039ce403bbe1d0ec7038033a0, Sequence #: 2. Contents: First message
    Processing message. Session: 311a216a560c47d184f9831984e6ac1d, Sequence #: 3. Contents: Second message
    Processing message. Session: f9a871be07414baf9505f2c3d466c4ab, Sequence #: 4. Contents: Third message
    Stopping and closing the processor
    

En la página Información general del espacio de nombres de Service Bus en Azure Portal, verá el recuento de mensajes entrantes y salientes. Espere alrededor de un minuto y actualice la página para ver los valores más recientes.

Captura de pantalla que muestra el recuento de mensajes entrantes y salientes.

Seleccione la cola en esta página Información general para ir a la página Cola de Service Bus. En esta página también verá el recuento de mensajes entrantes y salientes. También verá otra información, como el tamaño actual de la cola y el tamaño máximo, el recuento de mensajes activos.

Recorte de pantalla que muestra los detalles de la cola de los mensajes de esta cola.

Consulte la documentación y los ejemplos siguientes: