Prise en charge de Spring Messaging pour Azure Service Bus par Spring Cloud Azure

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

Messagerie Spring Azure Service Bus

Concepts clés

Azure Service Bus est un répartiteur de messages d’entreprise complètement managé, avec des files d’attente de messages et des rubriques de publication/abonnement. Le projet Spring Messaging pour Azure Service Bus applique les principaux concepts Spring au développement de solutions de messagerie basées sur Service Bus. Il fournit un modèle en tant qu’abstraction générale pour l’envoi de messages. Il prend également en charge les POJO pilotés par les messages avec des annotations @ServiceBusListener 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-servicebus</artifactId>
</dependency>

Paramétrage

La bibliothèque fournit les options de configuration suivantes pour ServiceBusTemplate et @ServiceBusListener:

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 Service Bus. Activé par défaut.
spring.cloud.azure.servicebus.enabled boolean Indique si Azure Service Bus est activé.
spring.cloud.azure.servicebus.connection-string Chaîne Valeur de chaîne de connexion de l’espace de noms Service Bus.
spring.cloud.azure.servicebus.custom-endpoint-address Chaîne Adresse de point de terminaison personnalisée à utiliser lors de la connexion à Service Bus.
spring.cloud.azure.servicebus.namespace Chaîne Valeur de l’espace de noms de Service Bus, qui constitue le préfixe du FQDN. Un FQDN doit se composer de NamespaceName.DomainName
spring.cloud.azure.servicebus.entity-type Chaîne Type d’entité d’azure Service Bus.

Utilisation de base

Convertisseur de messages Service Bus personnalisé

Il existe deux façons de configurer le convertisseur de messages Service Bus :

  • Configurez la propriété suivante pour que le convertisseur de messages Service Bus 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 Service Bus :

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

Envoyer des messages à Azure Service Bus

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:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • 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:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • 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}
            profile:
              tenant-id: <tenant>
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      

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.

  • 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>
          servicebus:
            namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
            entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
    

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. ServiceBusTemplate 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 ServiceBusTemplate serviceBusTemplate;
    
        public MyBean(ServiceBusTemplate serviceBusTemplate) {
            this.serviceBusTemplate = serviceBusTemplate;
        }
    
        public void someMethod() {
            this.serviceBusTemplate.sendAsync('QUEUE_NAME', MessageBuilder.withPayload("Hello world").build()).subscribe();
        }
    
    }
    

Recevoir des messages d’Azure Service Bus

Pour recevoir des messages, procédez comme suit :

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

  2. Ajoutez l’annotation @EnableAzureMessaging, qui déclenche la découverte des méthodes annotées avec @ServiceBusListener et crée en arrière-plan le conteneur d’écouteurs de messages.

    @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 ServiceBus est présente, vous pouvez annoter n’importe quel bean avec @ServiceBusListener pour créer un point de terminaison d’écoute. Le composant suivant crée un point de terminaison d’écouteur sur la file d’attente QUEUE_NAME :

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

Personnaliser les propriétés du client Service Bus

Les développeurs peuvent utiliser AzureServiceClientBuilderCustomizer pour personnaliser les propriétés du client Service Bus. L’exemple suivant personnalise la propriété sessionIdleTimeout dans ServiceBusClientBuilder:

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

Échantillons

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