Spring Cloud Azure 對 Spring Messaging Azure 記憶體佇列的支援

本文說明如何使用 Spring Cloud Azure 和 Spring Messaging Azure 記憶體佇列。 Spring Framework 提供與傳訊系統整合的廣泛支援。

Spring Messaging 的 Azure 儲存體佇列服務

重要概念

Azure 佇列記憶體是用來儲存大量訊息的服務。 您可以使用 HTTP 或 HTTPS 透過已驗證的呼叫,從世界各地存取訊息。 佇列訊息的大小最多可達 64 KB。 佇列可以包含數百萬則訊息,最多可達記憶體帳戶的總容量限制。 佇列通常用來建立待處理的工作積壓,以進行異步處理。 適用於 Azure 佇列記憶體的 Spring Messaging 專案會將核心 Spring 概念套用至服務總線型傳訊解決方案的開發。 它提供 範本 作為傳送和接收訊息的高階抽象概念。 這些連結庫會提升相依性插入和宣告式組態的使用。

相依性設定

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

設定

程式庫為 StorageQueueTemplate 提供下列組態選項:

財產 類型 說明
spring.cloud.azure.message-converter.isolated-object-mapper 布爾值 是否使用獨立的 ObjectMapper bean 作為儲存體佇列訊息轉換器。 默認為啟用。
spring.cloud.azure.storage.queue.enabled 布爾值 是否啟用 Azure 記憶體佇列。
spring.cloud.azure.storage.queue.connection-string 繩子 記憶體佇列命名空間連接字串值。
spring.cloud.azure.storage.queue.accountName 繩子 記憶體佇列帳戶名稱。
spring.cloud.azure.storage.queue.accountKey 繩子 儲存體佇列帳戶金鑰。

基本用法

自訂儲存體佇列訊息轉換器

有兩種方式可以設定記憶體佇列訊息轉換器:

  • 設定下列屬性,讓預設的儲存體佇列訊息轉換器使用 `ObjectMapper` Bean,而該 Bean 可以是您的自訂 `ObjectMapper` Bean,或是由 Spring Boot 管理的 Bean:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • 直接定義儲存體佇列訊息轉換器 Bean:

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

將訊息傳送和接收至 Azure 記憶體佇列

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

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

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

      spring:
        cloud:
          azure:
            storage:
              queue:
                account-name: ${AZURE_STORAGE_QUEUE_ACCOUNT_NAME}
      
    • 針對認證作為連接字串,請在 application.yml 檔案中設定下列屬性:

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

      spring:
        cloud:
          azure:
            credential:
              managed-identity-enabled: true
              client-id: ${AZURE_CLIENT_ID}
            profile:
              tenant-id: <tenant>
            storage:
              queue:
                account-name: ${AZURE_STORAGE_QUEUE_ACCOUNT_NAME}
      

備註

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>
          storage:
            queue:
              account-name: ${AZURE_STORAGE_QUEUE_ACCOUNT_NAME}
    

備註

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

  1. StorageQueueTemplate 已自動設定。 您可以將它直接連線到您自己的豆類以傳送或接收訊息,如下列範例所示:

    @Component
    public class MyBean {
    
        private final StorageQueueTemplate storageQueueTemplate;
    
        public MyBean(StorageQueueTemplate storageQueueTemplate) {
            this.storageQueueTemplate = storageQueueTemplate;
        }
    
        public void someMethod() {
            this.serviceBusTemplate.sendAsync('STORAGE_QUEUE_NAME', MessageBuilder.withPayload("Hello world").build()).subscribe();
        }
    
        public void processMessage() {
            Message<?> message = storageQueueTemplate.receiveAsync('STORAGE_QUEUE_NAME', Duration.ofSeconds(30)).block();
            // ...
        }
    
    }
    

範例

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