Compartir a través de


Uso de Azure Service Bus con JMS

Este artículo se aplica a:✅ versión 4.19.0 ✅ versión 5.19.0

En este artículo se describe cómo usar Azure Service Bus con la API de JMS integrada en el marco de Spring JMS.

Características principales

Conexión sin contraseña

La conexión sin contraseña usa la autenticación de Microsoft Entra para conectarse a servicios de Azure sin almacenar credenciales en la aplicación, sus archivos de configuración o en variables de entorno. La autenticación de Microsoft Entra es un mecanismo para conectarse a Azure Service Bus mediante identidades definidas en Microsoft Entra ID. Con la autenticación de Microsoft Entra, puede administrar Service Bus y otros servicios de Microsoft en una ubicación central, lo que simplifica la administración de permisos.

Cómo funciona

Spring Cloud Azure compila primero uno de los siguientes tipos de credenciales en función de la configuración de autenticación de la aplicación:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential

Si no se encuentra ninguno de estos tipos de credenciales, la cadena de credenciales a través de DefaultTokenCredential se usa para obtener credenciales de las propiedades de la aplicación, las variables de entorno, la identidad administrada o los IDE. Para más información, consulte autenticación de Azure de Spring Cloud.

Configuración de dependencias

Agregue las siguientes dependencias si desea migrar la aplicación Spring JMS para usar Azure Service Bus.

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>
</dependency>

Configuración

En la tabla siguiente se describen las propiedades configurables al usar la compatibilidad con Spring JMS:

Propiedad Descripción
spring.jms.servicebus.connection-string Cadena de conexión de Azure Service Bus para cuando desee proporcionar la cadena de conexión directamente.
spring.jms.servicebus.topic-client-id Identificador de cliente de JMS. Solo funciona para el topicJmsListenerContainerFactory bean.
spring.jms.servicebus.enabled Valor que indica si se va a habilitar la configuración automática de JMS de Service Bus. El valor predeterminado es true.
spring.jms.servicebus.idle-timeout La duración del tiempo de espera de inactividad de la conexión que indica cuánto tiempo espera que el cliente de Service Bus mantenga activa una conexión cuando no se entregue ningún mensaje. El valor predeterminado es 2m.
spring.jms.servicebushabilitado para .passwordless Si se habilita sin contraseña para JMS de Azure Service Bus. El valor predeterminado es false.
spring.jms.servicebus.pricing-tier Nivel de precio de Azure Service Bus. Los valores admitidos son Premium y estándar. El nivel Premium usa Java Message Service (JMS) 2.0, mientras que el nivel estándar usa JMS 1.1 para interactuar con Azure Service Bus.
spring.jms.servicebus.listener.reply-pub-sub-domain Valor que indica si el tipo de destino de respuesta es un tema. Solo funciona para el topicJmsListenerContainerFactory bean.
spring.jms.servicebus.listener.phase Fase en la que se debe iniciar y detener este contenedor.
spring.jms.servicebus.listener.reply-qos-settings Configura el QosSettings que se va a usar al enviar una respuesta.
spring.jms.servicebus.listener.subscription-durable Valor que indica si se debe hacer que la suscripción sea duradera. Solo funciona para el topicJmsListenerContainerFactory bean. El valor predeterminado es true.
spring.jms.servicebus.listener.subscription-shared Valor que indica si se va a compartir la suscripción. Solo funciona para el topicJmsListenerContainerFactory bean.
spring.jms.servicebus.pool.block-if-full Valor que indica si se va a bloquear cuando se solicita una conexión y el grupo está lleno. Establézcalo en false para iniciar un JMSException en su lugar.
spring.jms.servicebus.pool.block-if-full-timeout El período de bloqueo antes de iniciar una excepción si el grupo sigue lleno.
spring.jms.servicebus.pool.enabled Valor que indica si se debe crear un JmsPoolConnectionFactory, en lugar de un ConnectionFactorynormal.
spring.jms.servicebus.pool.idle-timeout Tiempo de espera de inactividad del grupo de conexiones.
spring.jms.servicebus.pool.max-connections Número máximo de conexiones agrupadas.
spring.jms.servicebus.pool.max-sessions-per-connection Número máximo de sesiones agrupadas por conexión en el grupo.
spring.jms.servicebus.pool.time-between-expiration-check El tiempo de suspensión entre las ejecuciones del subproceso de expulsión de conexión inactiva. Cuando es negativo, no se ejecuta ningún subproceso de expulsión de conexión inactiva.
spring.jms.servicebus.pool.use-anonymous-producers Valor que indica si se va a usar solo una instancia de MessageProducer anónima. Establézcalo en false para crear una MessageProducer cada vez que se requiera una.
spring.jms.servicebus.prefetch-policy.all Valor de reserva de la opción de captura previa en este espacio de nombres de Service Bus. El valor predeterminado es 0.
spring.jms.servicebus.prefetch-policy.durable-topic-prefetch Número de captura previa para el tema duradero. El valor predeterminado es 0.
spring.jms.servicebus.prefetch-policy.queue-browser-prefetch Número de captura previa para el explorador de colas. El valor predeterminado es 0.
spring.jms.servicebus.prefetch-policy.queue-prefetch Número de captura previa para la cola. El valor predeterminado es 0.
spring.jms.servicebus.prefetch-policy.topic-prefetch Número de captura previa del tema. El valor predeterminado es 0.

Nota

Se omite la configuración general de Spring JMS para abreviar.

Para obtener más información, vea documento de Spring JMS.

Uso básico

Conexión a JMS de Azure Service Bus con contraseña sin contraseña

Configure las siguientes propiedades en el archivo application.yml:

spring:
  jms:
    servicebus:
      namespace: ${AZURE_SERVICEBUS_NAMESPACE}
      pricing-tier: ${PRICING_TIER}
      passwordless-enabled: true

Importante

JMS de Azure Service Bus admite el uso de Microsoft Entra ID para autorizar solicitudes a recursos de Service Bus. Con el identificador de Microsoft Entra, asegúrese de que ha asignado el rol de propietario de datos de Azure Service Bus a la cuenta de Microsoft Entra que está usando actualmente. Para más información, consulte Asignación de roles de Azure mediante Azure Portal.

Conexión a Azure Service Bus con JMS mediante identidad administrada

  1. Para usar la identidad administrada, habilite la identidad administrada para el servicio y asigne el rol de Azure Service Bus Data Owner. Para obtener más información, consulte Autenticación de una identidad administrada con el identificador de Entra de Microsoft para acceder a los recursos de Azure Service Bus.

  2. Configure las siguientes propiedades en el archivo application.yml:

    spring:
      cloud:
        azure:
          credential:
            managed-identity-enabled: true
      jms:
        servicebus:
          namespace: ${AZURE_SERVICEBUS_NAMESPACE}
          pricing-tier: ${PRICING_TIER}
          passwordless-enabled: true
    

    Importante

    Si usa la identidad administrada asignada por el usuario, también debe agregar la propiedad spring.cloud.azure.credential.client-id con el identificador de cliente de identidad administrada asignada por el usuario.

Conexión a JMS de Azure Service Bus mediante la cadena de conexión

Agregue las siguientes propiedades y es bueno ir.

spring:
  jms:
    servicebus:
      connection-string: ${AZURE_SERVICEBUS_CONNECTION_STRING}
      pricing-tier: ${PRICING_TIER}

Conexiones

Spring Cloud Azure proporciona las tres opciones siguientes de Connection Factory para conectarse a JMS de Azure Service Bus:

  • JmsPoolConnectionFactory: establezca spring.jms.servicebus.pool.enabled=true o deje la configuración de grupo y caché sin establecer para usar el valor predeterminado. Esta fábrica mantiene un grupo de conexiones con opciones personalizables como spring.jms.servicebus.pool.max-connections. En la sección Configuración de Configuración de se detallan opciones de configuración adicionales con el prefijo . Esta configuración mejora el rendimiento aprovechando la funcionalidad de equilibrio de carga de Azure Service Bus, distribuyendo el tráfico entre varios puntos de conexión.

  • CachingConnectionFactory: establezca spring.jms.cache.enabled=true y deje spring.jms.servicebus.pool.enabled sin establecer. Esta factoría reutiliza una única conexión para todas las llamadas a JmsTemplate, lo que reduce la sobrecarga de creación de conexiones, lo que es ideal para escenarios de bajo tráfico. Sin embargo, este modo no aprovecha la funcionalidad de equilibrio de carga de Azure Service Bus.

  • ServiceBusJmsConnectionFactory: establezca spring.jms.servicebus.pool.enabled=false y spring.jms.cache.enabled=false para usar ServiceBusJmsConnectionFactory directamente, sin agrupación ni almacenamiento en caché. En este modo, cada llamada a JmsTemplate crea una nueva conexión, que puede ser de uso intensivo de recursos y menos eficaz.

Para obtener un rendimiento óptimo y la distribución de carga, se recomienda usar JmsPoolConnectionFactory estableciendo spring.jms.servicebus.pool.enabled=true. Evite encapsular un JmsPoolConnectionFactory con una CachingConnectionFactory o ServiceBusJmsConnectionFactory, ya que esto puede negar las ventajas de agrupación y podría dar lugar a mantener conexiones inactivas después de expulsarlas del grupo.

Nota

A partir de Spring Cloud Azure 5.19.0, el ConnectionFactory predeterminado se ha actualizado para JmsPoolConnectionFactory para usar mejor el equilibrio de carga del servidor de Service Bus. Si prefiere seguir usando el CachingConnectionFactory para almacenar en caché tanto Session como MessageProducer, establezca spring.jms.cache.enabled en true.

Muestras

Para más información, consulte el repositorio de azure-spring-boot-samples en GitHub.