Spring Cloud Azure-Unterstützung für Spring Messaging Azure Service Bus

In diesem Artikel wird beschrieben, wie Sie Spring Cloud Azure und Spring Messaging Azure Service Bus verwenden können. Das Spring Framework bietet umfassende Unterstützung für die Integration in Messaging-Systeme.

Spring Messaging – Azure Service Bus

Wichtige Begriffe

Bei Azure Service Bus handelt es sich um einen vollständig verwalteten Nachrichtenbroker für Unternehmen mit Nachrichtenwarteschlangen und Publish/Subscribe-Themen. Das Spring Messaging for Azure Service Bus-Projekt wendet kernige Spring-Konzepte auf die Entwicklung von Bus-basierten Service-Messaging-Lösungen an. Sie stellt eine Vorlage als allgemeine Abstraktion zum Senden von Nachrichten bereit. Es bietet auch Unterstützung für nachrichtengesteuerte POJOs mit @ServiceBusListener Anmerkungen und einem Listenercontainer. Diese Bibliotheken fördern die Verwendung von Abhängigkeitsinjektion und deklarativer Konfiguration. In all diesen Fällen können Sie Ähnlichkeiten mit der JMS-Unterstützung im Spring Framework und RabbitMQ-Support in Spring AMQP sehen.

Einrichtung von Abhängigkeiten

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

Konfiguration

Die Bibliothek bietet die folgenden Konfigurationsoptionen für ServiceBusTemplate und @ServiceBusListener:

Eigentum Typ BESCHREIBUNG
spring.cloud.azure.message-converter.isolated-object-mapper boolean Gibt an, ob ein isolierter ObjectMapper-Bean für den ServiceBus-Nachrichtenkonverter verwendet wird. Standardmäßig aktiviert.
spring.cloud.azure.servicebus.enabled boolean Gibt an, ob ein Azure Service Bus aktiviert ist.
spring.cloud.azure.servicebus.connection-string Schnur Service Bus-Namespace-Verbindungszeichenfolgenwert.
spring.cloud.azure.servicebus.custom-endpoint-address Schnur Die benutzerdefinierte Endpunktadresse, die beim Herstellen einer Verbindung mit Service Bus verwendet werden soll.
spring.cloud.azure.servicebus.namespace Schnur Wert des Service Bus-Namespace, der das Präfix der FQDN ist. Ein FQDN sollte aus NamespaceName.DomainName bestehen.
spring.cloud.azure.servicebus.entity-type Schnur Entitätstyp eines Azure Service Bus.

Grundlegende Nutzung

Benutzerdefinierter Servicebus-Nachrichtenkonverter

Es gibt zwei Möglichkeiten zum Konfigurieren des Service Bus-Nachrichtenkonverters:

  • Konfigurieren Sie die folgende Eigenschaft so, dass der standardmäßige Service Bus-Nachrichtenkonverter ein ObjectMapper Bean verwendet, das Ihr benutzerdefiniertes ObjectMapper Bean oder ein von Spring Boot verwaltetes Bean sein kann:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Definieren Sie das Bean für den Service Bus-Nachrichtenkonverter direkt:

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

Senden von Nachrichten an Azure Service Bus

Gehen Sie folgendermaßen vor, um Nachrichten zu senden:

  1. Füllen Sie die Optionen für die Konfiguration der Anmeldeinformationen mit einer der folgenden Methoden aus:

    • Konfigurieren Sie für Anmeldeinformationen als DefaultAzureCredential die folgenden Eigenschaften in Ihrer Datei application.yml:

      spring:
        cloud:
          azure:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Konfigurieren Sie für Anmeldeinformationen als Verbindungszeichenfolge die folgenden Eigenschaften in Ihrer application.yml Datei:

      spring:
        cloud:
          azure:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Wenn Sie verwaltete Identitäten als Anmeldeinformationen verwenden, konfigurieren Sie die folgenden Eigenschaften in Ihrer application.yml-Datei:

      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}
      

Hinweis

Die folgenden Werte sind für tenant-idzulässig: common, organizations, consumersoder die Mandanten-ID. Weitere Informationen zu diesen Werten finden Sie im Abschnitt Falschen Endpunkt verwendet (persönliche Konten und Organisationskonten) in Fehler AADSTS50020 – Benutzerkonto des Identitätsanbieters ist im Mandanten nicht vorhanden. Informationen zum Umwandeln Ihrer Single-Tenant-App finden Sie unter Single-Tenant-App in eine Multitenant-App auf Microsoft Entra ID umwandeln.

  • Konfigurieren Sie für Anmeldeinformationen als Dienstprinzipal die folgenden Eigenschaften in Ihrer application.yml-Datei:

    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}
    

Hinweis

Die folgenden Werte sind für tenant-idzulässig: common, organizations, consumersoder die Mandanten-ID. Weitere Informationen zu diesen Werten finden Sie im Abschnitt Falschen Endpunkt verwendet (persönliche Konten und Organisationskonten) in Fehler AADSTS50020 – Benutzerkonto des Identitätsanbieters ist im Mandanten nicht vorhanden. Informationen zum Umwandeln Ihrer Single-Tenant-App finden Sie unter Single-Tenant-App in eine Multitenant-App auf Microsoft Entra ID umwandeln.

  1. ServiceBusTemplate ist automatisch konfiguriert, und Sie können es direkt in Ihre eigenen Bohnen verkabeln, wie im folgenden Beispiel gezeigt:

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

Empfangen von Nachrichten von Azure Service Bus

Führen Sie die folgenden Schritte aus, um Nachrichten zu empfangen:

  1. Füllen Sie die Konfigurationsoptionen für die Anmeldedaten aus.

  2. Fügen Sie die @EnableAzureMessaging Anmerkung hinzu, die die Ermittlung von Methoden auslöst, die mit @ServiceBusListenerkommentiert werden, wodurch der Container für den Nachrichtenlistener unter den Deckeln erstellt wird.

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

    Hinweis

    Um Wiederholungen zu vermeiden, wird die Annotation @EnableAzureMessaging seit Version 5.21.0 von Spring Cloud Azure automatisch aktiviert.

  3. Wenn die ServiceBus-Infrastruktur vorhanden ist, können Sie eine beliebige Bean mit @ServiceBusListener annotieren, um einen Listener-Endpunkt zu erstellen. Die folgende Komponente erstellt einen Listener-Endpunkt für die QUEUE_NAME-Warteschlange:

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

Anpassen von ServiceBus-Clienteigenschaften

Entwickler können AzureServiceClientBuilderCustomizer zum Anpassen von Service Bus-Clienteigenschaften verwenden. Im folgenden Beispiel wird die eigenschaft sessionIdleTimeout in ServiceBusClientBuilderangepasst:

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

Beispiele

Weitere Informationen finden Sie im azure-spring-boot-samples Repository auf GitHub.