本文介绍如何将Azure 服务总线与集成到 Spring JMS 框架中的 JMS API 配合使用。
核心功能
无密码连接
无密码连接使用Microsoft Entra身份验证连接到Azure服务,而无需在应用程序、配置文件或环境变量中存储任何凭据。 Microsoft Entra身份验证是一种使用Microsoft Entra ID中定义的标识连接到Azure 服务总线的机制。 使用 Microsoft Entra 身份验证,可以在一个中心位置统一管理 服务总线 和其他 Microsoft 服务,从而简化权限管理。
工作原理
Spring Cloud Azure首先根据应用程序身份验证配置生成以下类型的凭据之一:
ClientSecretCredentialClientCertificateCredentialUsernamePasswordCredentialManagedIdentityCredential
如果未找到这些类型的凭据,则通过 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 服务总线 定价层。 支持的值是 premium 和 standard。 高级层使用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 Bean 有效。 默认值为 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 角色。
使用托管标识通过 JMS 连接到 Azure 服务总线
若要使用托管标识,请为服务启用托管标识,并分配
Azure 服务总线 Data Owner角色。 有关更多信息,请参阅 使用 Microsoft Entra ID 对托管标识进行身份验证以访问 Azure 服务总线 资源。在 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}
注意
Microsoft建议使用可用的最安全的身份验证流。 本过程中介绍的身份验证流程(例如数据库、缓存、消息传送或 AI 服务)需要非常高的信任度,并携带其他流中不存在的风险。 仅当更安全的选项(例如无密码连接或无密钥连接的托管标识)不可行时,才使用此流。 对于本地计算机操作,首选无密码连接或无密钥连接的用户标识。
连接
Spring Cloud Azure提供以下三个连接工厂选项,用于连接到 Azure 服务总线 JMS:
JmsPoolConnectionFactory:该工厂管理一个连接池,并支持spring.jms.servicebus.pool.max-connections等可自定义选项。 更多池配置设置(以spring.jms.servicebus.pool.为前缀)详见 Configuration 部分。 此设置通过使用Azure 服务总线的负载均衡功能在多个终结点之间分配流量来提高性能。CachingConnectionFactory:此工厂为对JmsTemplate的所有调用重复使用同一个连接,从而减少了连接创建的开销,这非常适合低流量场景。 但是,此模式不使用Azure 服务总线的负载均衡功能。ServiceBusJmsConnectionFactory:在此模式下,每次调用JmsTemplate都会创建一个新的连接,这可能会占用大量资源且效率更低。
当类路径中存在所有三个类时,使用哪一个类? 下表说明了根据配置属性会使用哪一种(自 Spring Cloud Azure 7.1.0 和 6.2.0 起):
spring.jms.servicebus.pool.enabled |
spring.jms.cache.enabled |
发件人 ConnectionFactory |
监听器容器 ConnectionFactory |
|---|---|---|---|
| 未设置 | 未设置 | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
| 未设置 | true |
CachingConnectionFactory |
CachingConnectionFactory |
| 未设置 | false |
ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
true |
未设置 | JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
true |
true |
CachingConnectionFactory |
CachingConnectionFactory |
true |
false |
JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
false |
未设置 | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
false |
true |
CachingConnectionFactory |
CachingConnectionFactory |
false |
false |
ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
注意
下表显示了未为不同的 Spring Cloud Azure 版本设置 ConnectionFactory 和 spring.jms.servicebus.pool.enabled 时的默认 spring.jms.cache.enabled:
| Spring Cloud Azure 版本 | 发件人 ConnectionFactory |
监听器容器 ConnectionFactory |
|---|---|---|
| >= 6.2.0 或 >= 7.1.0 | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
| 6.1.0 和 7.0.0 | ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
| <= 6.1.0 | JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
样品
有关详细信息,请参阅 GitHub 上的 azure-spring-boot-samples 存储库。