Guía del desarrollador de JMS 2.0 para Azure Service Bus

Esta guía contiene información detallada para ayudarle a comunicarse correctamente con Azure Service Bus mediante la API de Java Message Service (JMS) 2.0.

Como desarrollador de Java, si no está familiarizado con Azure Service Bus, considere la posibilidad de leer los artículos siguientes.

Introducción Conceptos

Modelo de programación de Java Message Service (JMS)

El modelo de programación de la API de Java Message Service es como se muestra en las secciones siguientes:

Nota:

El nivel Premium de Azure Service Bus admite JMS 1.1 y JMS 2.0.

El nivel estándar de Azure Service Bus admite la funcionalidad de JMS 1.1 limitada. Para más información, consulte esta documentación.

JMS: bloques de creación

Los siguientes bloques de creación están disponibles para comunicarse con la aplicación JMS.

Nota:

La guía siguiente se ha adaptado del tutorial de Oracle Java EE 6 para Java Message Service (JMS).

Se recomienda consultar este tutorial para comprender mejor el modelo Java Message Service (JMS).

Generador de conexiones

El cliente utiliza el objeto de generador de conexiones para conectar con el proveedor de JMS. El generador de conexiones encapsula un conjunto de parámetros de configuración de conexión definidos por el administrador.

Cada generador de conexiones es una instancia de la interfaz ConnectionFactory, QueueConnectionFactory o TopicConnectionFactory.

Para simplificar la conexión con Azure Service Bus, estas interfaces se implementan a través de ServiceBusJmsConnectionFactory, ServiceBusJmsQueueConnectionFactory o ServiceBusJmsTopicConnectionFactory, respectivamente.

Importante

Las aplicaciones Java que aprovechan la API de JMS 2.0 pueden conectarse a Azure Service Bus mediante la cadena de conexión o mediante un TokenCredential para aprovechar la autenticación respaldada por Microsoft Entra. Al usar la autenticación respaldada por Microsoft Entra, asegúrese de asignar roles y permisos a la identidad según sea necesario.

Cree una identidad administrada asignada por el sistema en Azure y use esta identidad para crear un TokenCredential.

TokenCredential tokenCredential = new DefaultAzureCredentialBuilder().build();

Así, se puede crear una instancia de la fábrica de conexiones con los parámetros siguientes.

  • Credencial de token: representa una credencial capaz de proporcionar un token de OAuth.
  • Host: nombre de host del espacio de nombres de nivel Premium de Azure Service Bus.
  • Contenedor de propiedades ServiceBusJmsConnectionFactorySettings que contiene
    • connectionIdleTimeoutMS: tiempo de espera de conexión inactivo en milisegundos
    • traceFrames: marca booleana para recopilar fotogramas de seguimiento de AMQP para la depuración
    • Otros parámetros de configuración

La fábrica se puede crear como se muestra aquí. Las credenciales de token y el host son parámetros necesarios, pero las demás propiedades son opcionales.

String host = "<YourNamespaceName>.servicebus.windows.net";
ConnectionFactory factory = new ServiceBusJmsConnectionFactory(tokenCredential, host, null); 

Destino de JMS

Un destino es el objeto que utiliza un cliente para especificar el destino de los mensajes que genera y el origen de los mensajes que consume.

Los destinos se asignan a entidades de Azure Service Bus: colas (en escenarios de punto a punto) y temas (en escenarios de publicación y suscripción).

Conexiones

Una conexión encapsula una conexión virtual con un proveedor de JMS. Con Azure Service Bus, esto representa una conexión con estado entre la aplicación y Azure Service Bus mediante AMQP.

Se crea una conexión desde el generador de conexiones, tal y como se muestra en el ejemplo siguiente.

Connection connection = factory.createConnection();

Sesiones

Una sesión es un contexto de un solo subproceso para generar y consumir mensajes. Se puede utilizar para crear mensajes, productores de mensajes y consumidores, pero también proporciona un contexto transaccional para permitir la agrupación de envíos y recepciones en una unidad atómica de trabajo.

Se puede crear una sesión a partir del objeto de conexión, como se muestra en el ejemplo siguiente:

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

Nota:

La API de JMS no admite la recepción de mensajes de colas o temas de Service Bus con sesiones de mensajería habilitadas.

Modos de sesión

Una sesión se puede crear con cualquiera de los siguientes modos.

Modos de sesión Comportamiento
Session.AUTO_ACKNOWLEDGE La sesión confirma automáticamente la recepción de un mensaje de un cliente, ya sea cuando la sesión ha regresado correctamente de una llamada de recepción o cuando el cliente de escucha del mensaje al que la sesión ha llamado para procesar el mensaje regresa correctamente.
Session.CLIENT_ACKNOWLEDGE El cliente confirma un mensaje consumido mediante la llamada al método de confirmación del mensaje.
Session.DUPS_OK_ACKNOWLEDGE Este modo de confirmación indica a la sesión que confirme de forma diferida la entrega de mensajes.
Session.SESSION_TRANSACTED Este valor se puede pasar como argumento al método createSession(int sessionMode) en el objeto de conexión para especificar que la sesión debe utilizar una transacción local.

Cuando no se especifica el modo de sesión, se selecciona Session.AUTO_ACKNOWLEDGE de forma predeterminada.

JMSContext

Nota:

JMSContext se define como parte de la especificación de JMS 2.0.

JMSContext combina la funcionalidad proporcionada por el objeto de conexión y de sesión. Se puede crear a partir del objeto generador de conexiones.

JMSContext context = connectionFactory.createContext();

Modos de JMSContext

Al igual que el objeto de sesión, JMSContext se puede crear con los mismos modos de confirmación que se mencionan en los modos de sesión.

JMSContext context = connectionFactory.createContext(JMSContext.AUTO_ACKNOWLEDGE);

Cuando no se especifica el modo, se selecciona JMSContext.AUTO_ACKNOWLEDGE de forma predeterminada.

Productores de mensajes JMS

Un productor de mensajes es un objeto que se crea mediante JMSContext o una sesión y se utiliza para enviar mensajes a un destino.

Se puede crear como un objeto independiente, como se muestra en el ejemplo siguiente:

JMSProducer producer = context.createProducer();

O crearse en un entorno de ejecución cuando es necesario enviar un mensaje.

context.createProducer().send(destination, message);

Consumidores de mensajes de JMS

Un consumidor de mensajes es un objeto que se crea mediante JMSContext o una sesión y se usa para recibir los mensajes enviados a un destino. Se puede crear como se muestra en este ejemplo:

JMSConsumer consumer = context.createConsumer(dest);

Recepciones sincrónicas mediante el método receive()

El consumidor de mensajes proporciona una manera sincrónica de recibir mensajes del destino mediante el método receive().

Si no se especifica ningún argumento o tiempo de espera, o se especifica un tiempo de espera de "0", el consumidor se bloquea indefinidamente a menos que llegue el mensaje o se interrumpa la conexión (lo que sea anterior).

Message m = consumer.receive();
Message m = consumer.receive(0);

Cuando se proporciona un argumento positivo distinto de cero, el consumidor se bloquea hasta que el temporizador expira.

Message m = consumer.receive(1000); // time out after one second.

Recepciones asincrónicas con clientes de escucha de mensajes JMS

Un cliente de escucha de mensajes es un objeto que se usa para el control asincrónico de los mensajes en un destino. Implementa la interfaz MessageListener, que contiene el método onMessage en el que debe residir la lógica de negocios específica.

Se debe crear una instancia de un objeto del cliente de escucha de mensajes y registrarla en un consumidor de mensajes específico mediante el método setMessageListener.

Listener myListener = new Listener();
consumer.setMessageListener(myListener);

Consumo desde temas

Los consumidores de mensajes JMS se crean en un destino que puede ser una cola o un tema.

Los consumidores en las colas son simplemente objetos del lado cliente que residen en el contexto de la sesión (y la conexión) entre la aplicación cliente y Azure Service Bus.

Sin embargo, los consumidores en los temas tienen dos partes:

  • Un objeto del lado cliente que reside en el contexto de la sesión (o JMSContext) y
  • una suscripción que es una entidad en Azure Service Bus.

Las suscripciones se documentan aquí y pueden ser una de las siguientes:

  • Suscripciones duraderas compartidas
  • Suscripciones no duraderas compartidas
  • Suscripciones duraderas no compartidas
  • Suscripciones no duraderas no compartidas

Exploradores de colas de JMS

La API de JMS proporciona un objeto QueueBrowser que permite a la aplicación examinar los mensajes de la cola y mostrar los valores de encabezado de cada mensaje.

Se puede crear un explorador de colas con JMSContext como en el ejemplo siguiente:

QueueBrowser browser = context.createBrowser(queue);

Nota:

La API de JMS no proporciona una API para examinar un tema.

Esto se debe a que el propio tema no almacena los mensajes. En cuanto se envía el mensaje al tema, se reenvía a las suscripciones adecuadas.

Selectores de mensajes de JMS

Se pueden usar los selectores de mensajes al recibir aplicaciones para filtrar los mensajes que se reciben. Con los selectores de mensajes, la aplicación receptora descarga el trabajo de filtrado de los mensajes al proveedor JMS (en este caso, Azure Service Bus) en lugar de asumir esa responsabilidad.

Los selectores se pueden usar al crear cualquiera de los siguientes consumidores:

  • Suscripciones duraderas compartidas
  • Suscripciones duraderas no compartidas
  • Suscripciones no duraderas compartidas
  • Suscripciones no duraderas no compartidas
  • Explorador de colas

Asignación de la operación de Service Bus y eliminación de AMQP

Así es como se convierte una disposición de AMQP en una operación de Service Bus:

ACCEPTED = 1; -> Complete()
REJECTED = 2; -> DeadLetter()
RELEASED = 3; (just unlock the message in service bus, will then get redelivered)
MODIFIED_FAILED = 4; -> Abandon() which increases delivery count
MODIFIED_FAILED_UNDELIVERABLE = 5; -> Defer()

Resumen

En esta guía para desarrolladores se muestra cómo las aplicaciones cliente de Java que usan Java Message Service (JMS) pueden interactuar con Azure Service Bus.

Pasos siguientes

Para más información sobre Azure Service Bus y las entidades de Java Message Service (JMS), consulte los artículos siguientes: