将 Azure 服务总线与 JMS 配合使用

本文 适用于:✅ 版本 4.19.0 ✅ 版本 5.19.0

本文介绍如何将 Azure 服务总线与集成到 Spring JMS 框架中的 JMS API 配合使用。

核心功能

无密码连接

无密码连接使用 Microsoft Entra 身份验证连接到 Azure 服务,而无需在应用程序、配置文件或环境变量中存储任何凭据。 Microsoft Entra 身份验证是一种使用Microsoft Entra ID 中定义的标识连接到 Azure 服务总线的机制。 使用 Microsoft Entra 身份验证,可以在中心位置管理服务总线和其他Microsoft服务,从而简化权限管理。

工作原理

Spring Cloud Azure 首先根据应用程序身份验证配置生成以下类型的凭据之一:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential

如果未找到这些类型的凭据,则通过 DefaultTokenCredential 的凭据链用于从应用程序属性、环境变量、托管标识或 IDE 获取凭据。 有关详细信息,请参阅 Spring Cloud Azure 身份验证

依赖项设置

如果要迁移 Spring JMS 应用程序以使用 Azure 服务总线,请添加以下依赖项。

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

配置

下表描述了使用 Spring JMS 支持时的可配置属性:

财产 描述
spring.jms.servicebus.connection-string 要直接提供连接字符串的 Azure 服务总线连接字符串。
spring.jms.servicebus.topic-client-id JMS 客户端 ID。 仅适用于 topicJmsListenerContainerFactory 豆。
spring.jms.servicebus.enabled 一个值,该值指示是否启用服务总线 JMS 自动配置。 默认值为 true
spring.jms.servicebus.idle-timeout 连接空闲超时持续时间,指示客户端在未传递消息时服务总线将连接保持活动状态的时间。 默认值为 2m
spring.jms.servicebus.passwordless-enabled 是否为 Azure 服务总线 JMS 启用无密码。 默认值为 false
spring.jms.servicebus.pricing-tier Azure 服务总线价格层。 支持的值 高级标准。 高级层使用 Java 消息服务 (JMS) 2.0,而标准层使用 JMS 1.1 与 Azure 服务总线交互。
spring.jms.servicebus.listener.reply-pub-sub-domain 一个值,该值指示回复目标类型是否为主题。 仅适用于 topicJmsListenerContainerFactory 豆。
spring.jms.servicebus.listener.phase 应启动和停止此容器的阶段。
spring.jms.servicebus.listener.reply-qos-settings 配置发送答复时要使用的 QosSettings
spring.jms.servicebus.listener.subscription-durable 一个值,该值指示是否使订阅持久化。 仅适用于 topicJmsListenerContainerFactory 豆。 默认值为 true
spring.jms.servicebus.listener.subscription-shared 一个值,该值指示是否共享订阅。 仅适用于 topicJmsListenerContainerFactory 豆。
spring.jms.servicebus.pool.block-if-full 一个值,该值指示是否在请求连接且池已满时阻止。 将其设置为 false 以改为引发 JMSException
spring.jms.servicebus.pool.block-if-full-timeout 如果池仍然已满,则引发异常之前的阻塞期。
spring.jms.servicebus.pool.enabled 一个值,该值指示是否应创建 JmsPoolConnectionFactory,而不是常规 ConnectionFactory
spring.jms.servicebus.pool.idle-timeout 连接池空闲超时。
spring.jms.servicebus.pool.max-connections 共用连接的最大数目。
spring.jms.servicebus.pool.max-sessions-per-connection 池中每个连接的共用会话数上限。
spring.jms.servicebus.pool.time-between-expiration-check 空闲连接逐出线程的运行之间的睡眠时间。 当为负时,不会运行空闲连接逐出线程。
spring.jms.servicebus.pool.use-anonymous-producers 一个值,该值指示是否仅使用一个匿名 MessageProducer 实例。 将其设置为 false,以便每次需要一个 MessageProducer 创建一个。
spring.jms.servicebus.prefetch-policy.all 此服务总线命名空间中预提取选项的回退值。 默认值为 0
spring.jms.servicebus.prefetch-policy.durable-topic-prefetch 持久主题的预提取数。 默认值为 0
spring.jms.servicebus.prefetch-policy.queue-browser-prefetch 队列浏览器的预提取数。 默认值为 0
spring.jms.servicebus.prefetch-policy.queue-prefetch 队列的预提取数。 默认值为 0
spring.jms.servicebus.prefetch-policy.topic-prefetch 主题的预提取数。 默认值为 0

注意

短时间内省略 Spring JMS 常规配置。

有关详细信息,请参阅 Spring JMS 文档

基本用法

使用无密码连接到 Azure 服务总线 JMS

application.yml 文件中配置以下属性:

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

重要

Azure 服务总线 JMS 支持使用 Microsoft Entra ID 来授权对服务总线资源的请求。 使用 Microsoft Entra ID,请确保已将 Azure 服务总线数据所有者 角色分配给当前正在使用的 Microsoft Entra 帐户。 有关详细信息,请参阅 使用 Azure 门户分配 Azure 角色。

使用托管标识连接到 Azure 服务总线

  1. 若要使用托管标识,请为服务启用托管标识并分配 Azure Service Bus Data Owner 角色。 有关详细信息,请参阅 使用 Microsoft Entra ID 对托管标识进行身份验证,以访问 Azure 服务总线资源。

  2. application.yml 文件中配置以下属性:

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

    重要

    如果使用用户分配的托管标识,还需要使用用户分配的托管标识客户端 ID 添加属性 spring.cloud.azure.credential.client-id

使用连接字符串连接到 Azure 服务总线 JMS

添加以下属性,可以继续操作。

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

连接

Spring Cloud Azure 提供以下三个连接工厂选项,用于连接到 Azure 服务总线 JMS:

  • JmsPoolConnectionFactory:设置 spring.jms.servicebus.pool.enabled=true 或取消设置池和缓存设置以使用默认值。 此工厂维护具有可自定义选项的连接池,如 spring.jms.servicebus.pool.max-connectionsspring.jms.servicebus.pool. 部分中详细介绍了其他池配置设置(以 为前缀)。 此设置利用 Azure 服务总线的负载均衡功能,跨多个终结点分配流量,从而提高性能。

  • CachingConnectionFactory:设置 spring.jms.cache.enabled=true 并将 spring.jms.servicebus.pool.enabled 保持未设置。 此工厂对所有调用 JmsTemplate重复使用单个连接,从而减少了创建连接开销,这非常适合低流量方案。 但是,此模式不利用 Azure 服务总线的负载均衡功能。

  • ServiceBusJmsConnectionFactory:将 spring.jms.servicebus.pool.enabled=falsespring.jms.cache.enabled=false 设置为直接使用 ServiceBusJmsConnectionFactory,无需进行池或缓存。 在此模式下,每次调用 JmsTemplate 都会创建一个新的连接,这可以占用大量资源且效率更低。

为了获得最佳性能和负载分布,我们建议通过设置 JmsPoolConnectionFactory来使用 spring.jms.servicebus.pool.enabled=true。 避免使用 JmsPoolConnectionFactoryCachingConnectionFactory 包装 ServiceBusJmsConnectionFactory,因为这可以否定池的好处,并可能导致在从池中逐出后保持非活动连接。

注意

从 Spring Cloud Azure 5.19.0 开始,默认 ConnectionFactory 已更新为 JmsPoolConnectionFactory,以更好地使用服务总线服务器负载均衡。 如果希望继续使用 CachingConnectionFactory 来缓存 SessionMessageProducer,请将 spring.jms.cache.enabled 设置为 true

样品

有关详细信息,请参阅 GitHub 上的 azure-spring-boot-samples 存储库