共用方式為


搭配 JMS 使用 Azure 服務總線

本文適用於:✅ 4.19.0 ✅ 5.19.0 版

本文說明如何使用 Azure 服務總線搭配整合至 Spring JMS 架構的 JMS API。

核心功能

無密碼連線

無密碼聯機會使用 Microsoft Entra 驗證來連線到 Azure 服務,而不需將任何認證儲存在應用程式、其組態檔或環境變數中。 Microsoft Entra 驗證是使用 Microsoft Entra 識別碼中定義的身分識別連線到 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 用戶端識別碼。 僅適用於 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 服務總線價格層。 支援的值為 premiumstandard。 進階層使用 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 檔

基本用法

使用無密碼連線到 Azure 服務總線 JMS

在您的 application.yml 檔案中設定下列屬性:

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

重要

Azure 服務總線 JMS 支援使用 Microsoft Entra 標識符來授權服務總線資源的要求。 使用 Microsoft Entra 識別符,請確定您已將 Azure 服務總線數據擁有者 角色指派給您目前使用的 Microsoft Entra 帳戶。 如需詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色。

使用受控識別與 JMS 連線到 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
    

    重要

    如果您使用使用者指派的受控識別,也需要使用使用者指派的受控識別用戶端標識符來新增 屬性 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-connections。 其他集區組態設定 - 前面加上 spring.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 存放庫