Spring Cloud Azure-ondersteuning voor Spring Messaging Azure Service Bus

In dit artikel wordt beschreven hoe u Spring Cloud Azure en Spring Messaging Azure Service Bus kunt gebruiken. Het Spring Framework biedt uitgebreide ondersteuning voor integratie met berichtensystemen.

Spring-berichtenverkeer Azure Servicebus

Belangrijke concepten

Azure Service Bus is een volledig beheerde enterprise-berichtenbroker met berichtenwachtrijen en onderwerpen over publiceren/abonneren. Het Spring Messaging-project voor Azure Service Bus past kernconcepten van Spring toe op de ontwikkeling van op service bus gebaseerde berichtenoplossingen. Het biedt een sjabloon als een abstractie op hoog niveau voor het verzenden van berichten. Het biedt ook ondersteuning voor berichtgestuurde POJOs met @ServiceBusListener aantekeningen en een listenercontainer. Deze bibliotheken bevorderen het gebruik van afhankelijkheidsinjectie en declaratieve configuratie. In al deze gevallen ziet u overeenkomsten met de JMS-ondersteuning in het Spring Framework en RabbitMQ-ondersteuning in Spring AMQP.

Afhankelijkheid instellen

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

Configuratie

De bibliotheek biedt de volgende configuratieopties voor ServiceBusTemplate en @ServiceBusListener:

Vastgoed Typ Beschrijving
spring.cloud.azure.message-converter.isolated-object-mapper booleaan Of een geïsoleerde ObjectMapper-bean wordt gebruikt voor Service Bus-berichtconversieprogramma. Standaard ingeschakeld.
spring.cloud.azure.servicebus.enabled booleaan Of een Azure Service Bus is ingeschakeld.
spring.cloud.azure.servicebus.connection-string Touwtje Service Bus-naamruimteverbindingsreekswaarde.
spring.cloud.azure.servicebus.custom-endpoint-address Touwtje Het aangepaste eindpuntadres dat moet worden gebruikt bij het maken van verbinding met Service Bus.
spring.cloud.azure.servicebus.namespace Touwtje Service Bus-naamruimtewaarde, het voorvoegsel van de FQDN. Een FQDN moet bestaan uit NamespaceName.DomainName
spring.cloud.azure.servicebus.entity-type Touwtje Entiteitstype van een Azure Service Bus.

Basaal gebruik

Custom Service Bus-berichtconversieprogramma

Er zijn twee manieren om Service Bus-berichtconversieprogramma te configureren:

  • Configureer de volgende eigenschap zodat de standaard Service Bus-berichtconverter een ObjectMapper-bean gebruikt. Dit kan uw aangepaste ObjectMapper-bean zijn of een bean die door Spring Boot wordt beheerd:

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Definieer de Service Bus-berichtconversieprogramma rechtstreeks:

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

Berichten verzenden naar Azure Service Bus

Gebruik de volgende stappen om berichten te verzenden:

  1. Vul de configuratieopties voor aanmeldgegevens in op een van de volgende manieren:

    • Voor aanmeldingsgegevens als DefaultAzureCredential configureert u de volgende eigenschappen in uw application.yml-bestand:

      spring:
        cloud:
          azure:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Voor referenties als verbindingsreeks configureert u de volgende eigenschappen in uw application.yml-bestand:

      spring:
        cloud:
          azure:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • Voor referenties als beheerde identiteiten configureert u de volgende eigenschappen in uw application.yml-bestand:

      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}
      

Opmerking

De volgende waarden zijn toegestaan voor tenant-id: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden de sectie Verkeerd eindpunt gebruikt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van identiteitsprovider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

  • Voor aanmeldingsgegevens voor een service-principal configureert u de volgende eigenschappen in uw application.yml-bestand:

    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}
    

Opmerking

De volgende waarden zijn toegestaan voor tenant-id: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden de sectie Verkeerd eindpunt gebruikt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van identiteitsprovider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

  1. ServiceBusTemplate is automatisch geconfigureerd en u kunt deze rechtstreeks in uw eigen bonen instellen, zoals wordt weergegeven in het volgende voorbeeld:

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

Berichten ontvangen van Azure Service Bus

Gebruik de volgende stappen om berichten te ontvangen:

  1. Vul de configuratieopties voor inloggegevens in.

  2. Voeg de @EnableAzureMessaging annotatie toe, die de detectie activeert van methoden die zijn geannoteerd met @ServiceBusListener, waardoor de container voor de berichtlistener onder de covers wordt gemaakt.

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

    Opmerking

    Om herhaling te voorkomen, wordt de annotatie @EnableAzureMessaging sinds versie 5.21.0 automatisch ingeschakeld door Spring Cloud Azure Auto-configure.

  3. Wanneer de ServiceBus-infrastructuur aanwezig is, kunt u aantekeningen maken bij elke bean met @ServiceBusListener om een listener-eindpunt te maken. Met het volgende onderdeel maakt u een listener-eindpunt in de QUEUE_NAME wachtrij:

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

Eigenschappen van Service Bus-client aanpassen

Ontwikkelaars kunnen AzureServiceClientBuilderCustomizer gebruiken om eigenschappen van de Service Bus-client aan te passen. In het volgende voorbeeld wordt de eigenschap sessionIdleTimeout in ServiceBusClientBuilderaangepast:

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

Voorbeelden

Zie de azure-spring-boot-samples opslagplaats op GitHub voor meer informatie.