Spring Cloud Azure 對 Spring Messaging Azure 事件中樞的支援

本文說明如何使用 Spring Cloud Azure 和 Spring Messaging Azure 事件中樞。 Spring Framework 提供與傳訊系統整合的廣泛支援。

Spring Messaging 與 Azure 事件中心

重要概念

Azure 事件中樞是雲端中的原生數據串流服務,每秒可串流數百萬個事件,且延遲低,從任何來源到任何目的地。 適用於 Azure 事件中樞的 Spring Messaging 專案會將核心 Spring 概念套用至事件中樞型傳訊解決方案的開發。 它會提供 範本 作為傳送訊息的高階抽象概念。 它也支援帶有 @EventHubsListener 註解和 監聽器容器的訊息驅動普通 Java 物件(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-eventhubs</artifactId>
</dependency>
<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>
</dependency>

設定

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

財產 類型 說明
spring.cloud.azure.message-converter.isolated-object-mapper 布爾值 隔離的 ObjectMapper bean 是否用於事件中樞訊息轉換器。 默認為啟用。
spring.cloud.azure.eventhubs.enabled 布爾值 是否啟用 Azure 事件中樞。
spring.cloud.azure.eventhubs.connection-string 繩子 事件中樞命名空間連接字串值。
spring.cloud.azure.eventhubs.namespace 繩子 Event Hubs 命名空間值,也就是 FQDN 的前綴。 FQDN 應該由 NamespaceName.DomainName 組成
spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name 繩子 記憶體帳戶的名稱。
spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key 繩子 儲存體帳戶存取金鑰。
spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name 繩子 記憶體容器名稱。

基本用法

自訂 Event Hubs 訊息轉換器

有兩種方式可以設定事件中樞訊息轉換器:

  • 設定下列屬性,讓預設的 Event Hubs 訊息轉換器使用 ObjectMapper Bean,其可為您自訂的 ObjectMapper Bean,或由 Spring Boot 管理的 Bean:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • 直接定義事件中樞訊息轉換器 Bean:

    @Bean
    AzureMessageConverter<EventData, EventData> eventHubsMessageConverter() {
        JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();
        return new EventHubsMessageConverter(jsonMapper);
    }
    

將訊息傳送至 Azure 事件中樞

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

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

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

      spring:
        cloud:
          azure:
            eventhubs:
              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}
              processor:
                checkpoint-store:
                  container-name: ${CHECKPOINT-CONTAINER}
                  account-name: ${CHECKPOINT-STORAGE-ACCOUNT}
      
    • 針對認證作為連接字串,請在 application.yml 檔案中設定下列屬性:

      spring:
        cloud:
          azure:
            eventhubs:
              connection-string: ${AZURE_EVENT_HUBS_CONNECTION_STRING}
              processor:
                checkpoint-store:
                  container-name: ${CHECKPOINT-CONTAINER}
                  account-name: ${CHECKPOINT-STORAGE-ACCOUNT}
                  account-key: ${CHECKPOINT-ACCESS-KEY}
      
    • 針對認證作為受控識別,請在 application.yml 檔案中設定下列屬性:

      spring:
        cloud:
          azure:
            credential:
              managed-identity-enabled: true
              client-id: ${AZURE_CLIENT_ID}
            eventhubs:
              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}
              processor:
                checkpoint-store:
                  container-name: ${CONTAINER_NAME}
                  account-name: ${ACCOUNT_NAME}
      
    • 若使用服務主體認證,請在 application.yml 檔案中設定下列屬性:

      spring:
        cloud:
          azure:
            credential:
              client-id: ${AZURE_CLIENT_ID}
              client-secret: ${AZURE_CLIENT_SECRET}
            profile:
              tenant-id: <tenant>
            eventhubs:
              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}
              processor:
                checkpoint-store:
                  container-name: ${CONTAINER_NAME}
                  account-name: ${ACCOUNT_NAME}
      

備註

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

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

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

從 Azure 事件中樞接收訊息

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

  1. 填寫認證組態選項。

  2. 新增 @EnableAzureMessaging 批注,如下列範例所示。 此註解會觸發尋找以 @EventHubsListener 註解的方法,並在幕後建立訊息接聽器容器。

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

    備註

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

  3. 當 Event Hubs 基礎結構存在時,您可以使用 @EventHubsListener 註解任何 Bean,以建立接聽器端點。 下列元件會在 EVENT_HUB_NAME 事件中樞與 $Default 取用者群組上建立接聽端點:

    @Component
    public class MyBean {
    
        @EventHubsListener(destination = "EVENT_HUB_NAME", group = "$Default")
        public void processMessage(String content) {
            // ...
        }
    
    }
    

範例

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