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 ConnectionFactory normal. |
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
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.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
: establezcaspring.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 comospring.jms.servicebus.pool.max-connections
. En la sección Configuración deConfiguració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
: establezcaspring.jms.cache.enabled=true
y dejespring.jms.servicebus.pool.enabled
sin establecer. Esta factoría reutiliza una única conexión para todas las llamadas aJmsTemplate
, 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
: establezcaspring.jms.servicebus.pool.enabled=false
yspring.jms.cache.enabled=false
para usarServiceBusJmsConnectionFactory
directamente, sin agrupación ni almacenamiento en caché. En este modo, cada llamada aJmsTemplate
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.