本文說明如何將 Azure 服務匯流排 與 JMS API 整合進 Spring JMS 框架中。
核心功能
無密碼連線
無密碼連線使用 Microsoft Entra 認證來連接 Azure 服務,且不會在應用程式、設定檔或環境變數中儲存任何憑證。 Microsoft Entra 認證是一種利用 Microsoft Entra ID 中定義的身份來連接 Azure 服務匯流排 的機制。 透過 Microsoft Entra 認證,你可以在集中管理 服務匯流排 及其他 Microsoft 服務,簡化權限管理。
運作方式
Spring Cloud Azure 首先根據應用程式認證設定,建立以下一種類型的憑證:
ClientSecretCredentialClientCertificateCredentialUsernamePasswordCredentialManagedIdentityCredential
如果找不到這些類型的認證,則會使用透過 DefaultTokenCredential 的認證鏈結,從應用程式屬性、環境變數、受控識別或 IDE 取得認證。 欲了解更多資訊,請參閱 Spring Cloud Azure authentication。
相依性設定
如果你想將 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 用戶端識別碼。 僅適用於 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 |
The Azure 服務匯流排 Price Tier. 支援的值為 premium 和 standard。 高級等級使用 Java Message Service (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 檔。
基本用法
Connect to Azure 服務匯流排 JMS using passwordless
在您的 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帳號。 欲了解更多資訊,請參閱 Assignment Azure Assignment with the Azure portal。
Connect to Azure 服務匯流排 with JMS use Managed Identity
要使用受管理身份,請啟用該管理身份給你的服務,並指派
Azure 服務匯流排 Data Owner角色。 欲了解更多資訊,請參閱 Authenticate a managed identity with Microsoft Entra ID to access Azure 服務匯流排 resources。在您的 application.yml 檔案中設定下列屬性:
spring: cloud: azure: credential: managed-identity-enabled: true jms: servicebus: namespace: ${AZURE_SERVICEBUS_NAMESPACE} pricing-tier: ${PRICING_TIER} passwordless-enabled: true重要
如果您使用使用者指派的受控識別,也需要使用使用者指派的受控識別用戶端標識符來新增 屬性
spring.cloud.azure.credential.client-id。
Connect to Azure 服務匯流排 JMS using 連接字串
新增下列屬性,而且您最好繼續。
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.-)詳述於 「設定 」部分。 此配置透過使用 Azure 服務匯流排 的負載平衡功能,將流量分配至多個端點,提升效能。CachingConnectionFactory:此工廠會重複使用單一連線來處理所有呼叫,JmsTemplate減少連線建立的開銷,非常適合低流量情境。 不過,此模式並未使用 Azure 服務匯流排 的負載平衡功能。ServiceBusJmsConnectionFactory在此模式下,每次呼叫都會JmsTemplate產生一個新的連線,這可能耗費資源且效率較低。
當類別路徑中三個類別都存在時,會使用哪一個? 下表說明根據配置屬性所使用的配置(自 Spring Cloud Azure
spring.jms.servicebus.pool.enabled |
spring.jms.cache.enabled |
發送者 ConnectionFactory |
Listener Container 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.jms.servicebus.pool.enabled 和 spring.jms.cache.enabled 未設定為不同 Spring Cloud Azure 版本時,預設的 ConnectionFactory:
| Spring Cloud Azure version | 發送者 ConnectionFactory |
Listener container ConnectionFactory |
|---|---|---|
| >= 6.2.0 或 >= 7.2.0 | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
| 6.1.0 與 7.0.0 | ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
| <= 6.1.0 | JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
樣品
欲了解更多資訊,請參閱GitHub上的 azure-spring-boot-samples 資料庫。