Supporto di Spring Cloud Azure per il bus di servizio di Azure Spring Messaging

Questo articolo descrive come è possibile usare Spring Cloud Azure e Spring Messaging bus di servizio di Azure. Spring Framework offre un ampio supporto per l'integrazione con i sistemi di messaggistica.

Spring Messaging Service Bus di Azure

Concetti chiave

Bus di Servizio di Azure è un broker di messaggi aziendale completamente gestito, con code di messaggi e argomenti per la pubblicazione/sottoscrizione. Il progetto Spring Messaging per il bus di servizio di Azure applica i concetti di base di Spring allo sviluppo di soluzioni di messaggistica basate sul bus di servizio. Fornisce un modello come astrazione di alto livello per l'invio di messaggi. Fornisce inoltre il supporto per gli oggetti POJO basati su messaggi con annotazioni @ServiceBusListener e un contenitore listener . Queste librerie promuovono l'uso dell'inserimento delle dipendenze e della configurazione dichiarativa. In tutti questi casi è possibile osservare analogie con il supporto JMS nel supporto Spring Framework e RabbitMQ in Spring AMQP.

Configurazione delle dipendenze

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

Configurazione

La libreria offre le opzioni di configurazione seguenti per ServiceBusTemplate e @ServiceBusListener:

Proprietà TIPO Descrizione
spring.cloud.azure.message-converter.isolated-object-mapper booleano Indica se per il convertitore di messaggi del bus di servizio viene utilizzato un bean ObjectMapper isolato. Abilitato per impostazione predefinita.
spring.cloud.azure.servicebus.enabled booleano Indica se un bus di servizio di Azure è abilitato.
spring.cloud.azure.servicebus.connection-string Stringa Valore della stringa di connessione del namespace di bus di servizio.
spring.cloud.azure.servicebus.custom-endpoint-address Stringa Indirizzo dell'endpoint personalizzato da usare per la connessione al bus di servizio.
spring.cloud.azure.servicebus.namespace Stringa Valore dello spazio dei nomi di bus di servizio, che corrisponde al prefisso dell'FQDN. Un FQDN deve essere composto da NamespaceName.DomainName
spring.cloud.azure.servicebus.entity-type Stringa Tipo di entità di un bus di servizio di Azure.

Utilizzo di base

Convertitore di messaggi personalizzato di bus di servizio

Esistono due modi per configurare il convertitore di messaggi del bus di servizio:

  • Configurare la proprietà seguente in modo che il convertitore di messaggi del bus di servizio predefinito usi un ObjectMapper bean, che può essere il bean personalizzato ObjectMapper o uno gestito da Spring Boot:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Definire direttamente il bean del convertitore di messaggi del bus di servizio:

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

Inviare messaggi al bus di servizio di Azure

Per inviare messaggi, seguire questa procedura:

  1. Compilare le opzioni di configurazione delle credenziali usando uno degli approcci seguenti:

    • Per le credenziali come DefaultAzureCredential, configurare le proprietà seguenti nel file application.yml:

      spring:
        cloud:
          azure:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Per le credenziali come stringa di connessione, configurare le proprietà seguenti nel file application.yml:

      spring:
        cloud:
          azure:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Per le credenziali come identità gestite, configurare le proprietà seguenti nel file 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}
      

Annotazioni

Per tenant-idsono consentiti i valori seguenti: common, organizations, consumerso l'ID tenant. Per ulteriori informazioni su questi valori, consultare la sezione Utilizzato l'endpoint sbagliato (account personali e organizzativi) di Errore AADSTS50020 - L'account utente del provider di identità non esiste nel tenant. Per informazioni sulla conversione della tua app a tenant singolo in multi-tenant, vedere Convertire app a tenant singolo in multi-tenant in Microsoft Entra ID.

  • Per le credenziali del service principal, configura le proprietà seguenti nel file 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}
    

Annotazioni

Per tenant-idsono consentiti i valori seguenti: common, organizations, consumerso l'ID tenant. Per ulteriori informazioni su questi valori, consultare la sezione Utilizzato l'endpoint sbagliato (account personali e organizzativi) di Errore AADSTS50020 - L'account utente del provider di identità non esiste nel tenant. Per informazioni sulla conversione della tua app a tenant singolo in multi-tenant, vedere Convertire app a tenant singolo in multi-tenant in Microsoft Entra ID.

  1. ServiceBusTemplate viene configurato automaticamente ed è possibile iniettarlo direttamente nei propri bean, come mostrato nell'esempio seguente:

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

Ricevere messaggi dal bus di servizio di Azure

Per ricevere messaggi, seguire questa procedura:

  1. Immettere le opzioni di configurazione delle credenziali.

  2. Aggiungere l'annotazione @EnableAzureMessaging, che attiva l'individuazione dei metodi annotati con @ServiceBusListener, creando il contenitore del listener dei messaggi sotto le quinte.

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

    Annotazioni

    Per evitare ripetizioni, a partire dalla versione 5.21.0, Spring Cloud Azure Auto-configure abilita automaticamente l'annotazione @EnableAzureMessaging.

  3. Quando l'infrastruttura ServiceBus è presente, è possibile annotare qualsiasi bean con @ServiceBusListener per creare un endpoint del listener. Il componente seguente crea un endpoint del listener nella coda QUEUE_NAME:

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

Personalizzare le proprietà del client di bus di servizio

Gli sviluppatori possono usare AzureServiceClientBuilderCustomizer per personalizzare le proprietà client del bus di servizio. Nell'esempio seguente viene personalizzata la proprietà sessionIdleTimeout in ServiceBusClientBuilder:

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

Esempi

Per altre informazioni, vedere il azure-spring-boot-samples repository in GitHub.