Prise en charge de Spring Messaging Azure Event Hubs par Spring Cloud Azure

Cet article explique comment utiliser Spring Cloud Azure et Spring Messaging Azure Event Hubs. Spring Framework offre une prise en charge étendue de l’intégration à des systèmes de messagerie.

Messagerie Spring Azure Event Hubs

Concepts clés

Azure Event Hubs est un service de streaming de données natif dans le cloud qui peut diffuser des millions d’événements par seconde, avec une faible latence, de n’importe quelle source à n’importe quelle destination. Le projet Spring Messaging pour Azure Event Hubs applique les principaux concepts Spring au développement de solutions de messagerie basées sur event hubs. Il fournit un modèle en tant qu’abstraction générale pour l’envoi de messages. Il prend également en charge les objets Java simples (POJO) pilotés par messages avec des annotations @EventHubsListener et un conteneur de listeners. Ces bibliothèques favorisent l’utilisation de l’injection de dépendances et de la configuration déclarative. Dans tous ces cas, vous pouvez constater des similitudes avec la prise en charge de JMS dans le Spring Framework et la prise en charge de RabbitMQ dans Spring AMQP.

Configuration des dépendances

<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>

Paramétrage

La bibliothèque fournit les options de configuration suivantes pour EventHubsTemplate et @EventHubsListener:

Propriété Type Descriptif
spring.cloud.azure.message-converter.isolated-object-mapper boolean Indique si une bean ObjectMapper isolée est utilisée pour le convertisseur de messages Event Hubs. Activé par défaut.
spring.cloud.azure.eventhubs.enabled boolean Indique si azure Event Hubs est activé.
spring.cloud.azure.eventhubs.connection-string Chaîne Valeur de chaîne de connexion de l’espace de noms Event Hubs.
spring.cloud.azure.eventhubs.namespace Chaîne Valeur de l’espace de noms Event Hubs, qui est le préfixe du FQDN. Un FQDN doit se composer de NamespaceName.DomainName
spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name Chaîne Nom du compte de stockage.
spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key Chaîne Clé d’accès au compte de stockage.
spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name Chaîne Nom du conteneur de stockage.

Utilisation de base

Convertisseur de messages Event Hubs personnalisé

Il existe deux façons de configurer le convertisseur de messages Event Hubs :

  • Configurez la propriété suivante pour que le convertisseur de messages Event Hubs par défaut utilise un ObjectMapper bean, qui peut être votre bean personnalisé ObjectMapper ou un géré par Spring Boot :

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Définissez directement le convertisseur de messages Event Hubs :

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

Envoyer des messages à Azure Event Hubs

Pour envoyer des messages, procédez comme suit :

  1. Renseignez les options de configuration des informations d’identification à l’aide de l’une des approches suivantes :

    • Pour les informations d’identification en tant que DefaultAzureCredential, configurez les propriétés suivantes dans votre fichier application.yml :

      spring:
        cloud:
          azure:
            eventhubs:
              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}
              processor:
                checkpoint-store:
                  container-name: ${CHECKPOINT-CONTAINER}
                  account-name: ${CHECKPOINT-STORAGE-ACCOUNT}
      
    • Pour les informations d’identification sous forme de chaîne de connexion, configurez les propriétés suivantes dans votre fichier 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}
      
    • Pour les informations d’identification en tant qu’identités managées, configurez les propriétés suivantes dans votre fichier 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}
      
    • Pour les informations d’identification en tant que principal de service, configurez les propriétés suivantes dans votre fichier 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}
      

Remarque

Les valeurs suivantes sont autorisées pour tenant-id: common, organizations, consumersou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez la section Utilisation d’un point de terminaison incorrect (comptes personnels et d’organisation) de l’article Erreur AADSTS50020 : Le compte d’utilisateur du fournisseur d’identité n’existe pas dans le locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en application multilocataire sur Microsoft Entra ID.

  1. EventHubsTemplate est configuré automatiquement, et vous pouvez l’injecter automatiquement directement dans vos propres beans, comme indiqué dans l’exemple suivant :

    @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();
        }
    
    }
    

Recevoir des messages d’Azure Event Hubs

Pour recevoir des messages, procédez comme suit :

  1. Renseignez les options de configuration des informations d’identification.

  2. Ajoutez l’annotation @EnableAzureMessaging, comme illustré dans l’exemple suivant. Cette annotation déclenche la découverte de méthodes annotées avec @EventHubsListener, en créant le conteneur d’écouteurs de messages sous les couvertures.

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

    Remarque

    Pour éviter les répétitions, depuis la version 5.21.0, Spring Cloud Azure Auto-configure active automatiquement l’annotation @EnableAzureMessaging.

  3. Lorsque l’infrastructure Event Hubs est présente, vous pouvez annoter n’importe quel bean avec @EventHubsListener pour créer un point de terminaison d’écoute. Le composant suivant crée un point de terminaison d’écouteur sur le hub d’événements EVENT_HUB_NAME et le groupe de consommateurs $Default :

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

Échantillons

Pour plus d’informations, consultez le azure-spring-boot-samples référentiel sur GitHub.