Spring Cloud Azure 對 Spring Messaging Azure 服務總線的支援

本文說明如何使用 Spring Cloud Azure 和 Spring Messaging Azure 服務總線。 Spring Framework 提供與傳訊系統整合的廣泛支援。

Spring Messaging Azure 服務匯流匝道

重要概念

Azure 服務匯流排是完全管理的企業訊息代理程式,提供訊息佇列和發佈/訂閱主題。 適用於 Azure 服務總線專案的 Spring Messaging 會將核心 Spring 概念套用至服務總線型傳訊解決方案的開發。 它會提供 範本 作為傳送訊息的高階抽象概念。 它也支援帶有 @ServiceBusListener 註解和 監聽器容器 的訊息驅動 POJO。 這些連結庫會提升相依性插入和宣告式組態的使用。 在這些情況下,您可以看到 Spring Framework 中的 JMS 支援和 Spring AMQP 中的 RabbitMQ 支援相似之處。

相依性設定

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

設定

此程式庫提供下列供 ServiceBusTemplate 和 @ServiceBusListener 使用的組態選項:

財產 類型 說明
spring.cloud.azure.message-converter.isolated-object-mapper 布爾值 隔離的 ObjectMapper bean 是否用於服務總線訊息轉換器。 默認為啟用。
spring.cloud.azure.servicebus.enabled 布爾值 是否啟用 Azure 服務總線。
spring.cloud.azure.servicebus.connection-string 繩子 服務總線命名空間連接字串值。
spring.cloud.azure.servicebus.custom-endpoint-address 繩子 連接到服務總線時要使用的自訂端點位址。
spring.cloud.azure.servicebus.namespace 繩子 服務總線命名空間值,這是 FQDN 的前置詞。 FQDN 應該由 NamespaceName.DomainName 組成
spring.cloud.azure.servicebus.entity-type 繩子 Azure 服務總線的實體類型。

基本用法

自訂服務總線訊息轉換器

有兩種方式可以設定服務總線訊息轉換器:

  • 設定下列屬性,讓預設的 服務匯流排 訊息轉換器使用 ObjectMapper Bean;該 Bean 可以是您自訂的 ObjectMapper Bean,或是由 Spring Boot 管理的 Bean:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • 直接定義服務總線訊息轉換器 Bean:

    @Bean
    AzureMessageConverter<ServiceBusReceivedMessage, ServiceBusMessage> serviceBusMessageConverter() {
        JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();
        return new ServiceBusMessageConverter(jsonMapper);
    }
    

將訊息傳送至 Azure 服務總線

使用下列步驟來傳送訊息:

  1. 使用下列其中一種方法填入認證組態選項:

    • 若使用 DefaultAzureCredential 作為認證憑證,請在 application.yml 檔案中設定下列屬性:

      spring:
        cloud:
          azure:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • 針對認證作為連接字串,請在 application.yml 檔案中設定下列屬性:

      spring:
        cloud:
          azure:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • 針對認證作為受控識別,請在 application.yml 檔案中設定下列屬性:

      spring:
        cloud:
          azure:
            credential:
              managed-identity-enabled: true
              client-id: ${AZURE_CLIENT_ID}
            profile:
              tenant-id: <tenant>
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      

備註

tenant-id允許下列值:common、organizations、consumers或租用戶標識符。 如需這些值的詳細資訊,請參閱 使用錯誤的端點(個人和組織帳戶)一節中的錯誤AADSTS50020 - 來自身分識別提供者的用戶帳戶不存在於租使用者。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。

  • 若使用服務主體認證,請在 application.yml 檔案中設定下列屬性:

    spring:
      cloud:
        azure:
          credential:
            client-id: ${AZURE_CLIENT_ID}
            client-secret: ${AZURE_CLIENT_SECRET}
          profile:
            tenant-id: <tenant>
          servicebus:
            namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
            entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
    

備註

tenant-id允許下列值:common、organizations、consumers或租用戶標識符。 如需這些值的詳細資訊,請參閱 使用錯誤的端點(個人和組織帳戶)一節中的錯誤AADSTS50020 - 來自身分識別提供者的用戶帳戶不存在於租使用者。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。

  1. ServiceBusTemplate 會自動配置,您也可以如以下範例所示,將它直接自動裝配到您自己的 Bean 中:

    @Component
    public class MyBean {
    
        private final ServiceBusTemplate serviceBusTemplate;
    
        public MyBean(ServiceBusTemplate serviceBusTemplate) {
            this.serviceBusTemplate = serviceBusTemplate;
        }
    
        public void someMethod() {
            this.serviceBusTemplate.sendAsync('QUEUE_NAME', MessageBuilder.withPayload("Hello world").build()).subscribe();
        }
    
    }
    

從 Azure 服務總線接收訊息

使用下列步驟來接收訊息:

  1. 填寫認證組態選項。

  2. 加入 @EnableAzureMessaging 批註,這會觸發探索以 @ServiceBusListener 標註的方法,並在幕後建立訊息接聽器容器。

    @SpringBootApplication
    @EnableAzureMessaging
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    備註

    為避免重複,自 5.21.0 版起,Spring Cloud Azure 自動設定會自動啟用註解 @EnableAzureMessaging。

  3. 當 ServiceBus 基礎結構存在時,您可以標註任何具有 @ServiceBusListener 的 Bean 來建立接聽程式端點。 下列元件會在 QUEUE_NAME 佇列上建立接聽程式端點:

    @Component
    public class MyBean {
    
        @ServiceBusListener(destination = "QUEUE_NAME")
        public void processMessage(String content) {
            // ...
        }
    
    }
    

自訂服務總線客戶端屬性

開發人員可以使用 AzureServiceClientBuilderCustomizer 來自定義服務總線用戶端屬性。 下列範例會自訂 sessionIdleTimeout中的 ServiceBusClientBuilder 屬性:

@Bean
public AzureServiceClientBuilderCustomizer<ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder> customizeBuilder() {
    return builder -> builder.sessionIdleTimeout(Duration.ofSeconds(10));
}

範例

欲了解更多資訊,請參閱 azure-spring-boot-samples GitHub 上的倉庫。