Share via


Azure Service Bus gebruiken in Spring-toepassingen

In dit artikel leest u hoe u Azure Service Bus gebruikt in Java-toepassingen die zijn gebouwd met Spring Framework.

Azure biedt een asynchroon berichtenplatform met de naam Azure Service Bus (Service Bus), dat is gebaseerd op de standaard Advanced Message Queueing Protocol 1.0 (AMQP 1.0). U kunt Service Bus gebruiken in het bereik van ondersteunde Azure-platforms.

Spring Cloud Azure biedt verschillende modules voor het verzenden van berichten naar en het ontvangen van berichten van Service Bus-wachtrijen en onderwerpenabonnementen/ met behulp van Spring-frameworks.

U kunt de volgende modules onafhankelijk gebruiken of combineren voor verschillende gebruiksvoorbeelden:

Vereisten

Notitie

Als u uw account toegang wilt verlenen tot uw Service Bus-resources, wijst u in uw zojuist gemaakte Azure Service Bus-naamruimte de rollen Azure Service Bus Data Sender en Azure Service Bus Data Receiver toe aan het Microsoft Entra-account dat u momenteel gebruikt. Zie voor meer informatie Azure-rollen toewijzen met behulp van de Azure-portal.

Belangrijk

Spring Boot versie 2.5 of hoger is vereist om de stappen in deze zelfstudie uit te voeren.

Uw lokale omgeving voorbereiden

In deze zelfstudie hebben de configuraties en code geen verificatiebewerkingen. Voor het maken van verbinding met een Azure-service is echter verificatie vereist. Als u de verificatie wilt voltooien, moet u de Azure Identity-clientbibliotheek gebruiken. Spring Cloud Azure maakt gebruik DefaultAzureCredentialvan, die de Azure Identity-bibliotheek biedt om u te helpen referenties op te halen zonder dat er codewijzigingen zijn aangebracht.

DefaultAzureCredential ondersteunt meerdere verificatiemethoden en bepaalt welke methode tijdens runtime moet worden gebruikt. Met deze aanpak kan uw app verschillende verificatiemethoden gebruiken in verschillende omgevingen, zoals lokale of productieomgevingen, zonder omgevingsspecifieke code te implementeren. Zie de sectie DefaultAzureCredential van Door Azure gehoste Java-toepassingen verifiëren voor meer informatie.

Als u Azure CLI, IntelliJ of andere methoden wilt gebruiken om de verificatie in lokale ontwikkelomgevingen te voltooien, raadpleegt u Azure-verificatie in Java-ontwikkelomgevingen. Als u de verificatie in Azure-hostingomgevingen wilt voltooien, raden we u aan beheerde identiteit te gebruiken. Zie Wat zijn beheerde identiteiten voor Azure-resources? voor meer informatie.

Notitie

Azure Service Bus voor JMS API biedt momenteel geen ondersteuning DefaultAzureCredentialvoor . Als u Spring JMS met Service Bus gebruikt, negeert u deze stap.

Spring Cloud Azure Service Bus Starter gebruiken

De Spring Cloud Azure Service Bus Starter-module importeert de Service Bus Java-clientbibliotheek met Spring Boot Framework. U kunt Spring Cloud Azure en de Azure SDK samen gebruiken in een niet-wederzijds exclusief patroon. U kunt de Service Bus Java-client-API dus blijven gebruiken in uw Spring-toepassing.

De Service Bus-afhankelijkheid toevoegen

Als u de Spring Cloud Azure Service Bus Starter-module wilt installeren, voegt u de volgende afhankelijkheden toe aan uw pom.xml-bestand :

  • De Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>5.12.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Notitie

    Als u Spring Boot 2.x gebruikt, moet u de spring-cloud-azure-dependencies versie instellen op 4.18.0. Deze stuklijst (Bill of Material) moet worden geconfigureerd in de <dependencyManagement> sectie van uw pom.xml-bestand . Dit zorgt ervoor dat alle Spring Cloud Azure-afhankelijkheden dezelfde versie gebruiken. Zie welke versie van Spring Cloud Azure moet ik gebruiken voor meer informatie over de versie die voor deze BOM wordt gebruikt.

  • Het Spring Cloud Azure Service Bus-artefact:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-servicebus</artifactId>
    </dependency>
    

Codeer de toepassing om berichten te verzenden en te ontvangen

In deze handleiding leert u hoe u de Service Bus Java-clients gebruikt in de context van een Spring-toepassing. Hier introduceren we twee alternatieven. De aanbevolen manier is om Automatisch configureren van Spring Boot te gebruiken en kant-en-klare clients uit de Spring-context te gebruiken. U kunt clients ook programmatisch bouwen.

De eerste manier, waarbij automatische bedrading van de clientbonen uit de Spring IoC-container omvat, heeft de volgende voordelen in vergelijking met de tweede manier. Deze voordelen bieden u een flexibelere en efficiëntere ervaring bij het ontwikkelen met Service Bus-clients.

  • U kunt een externe configuratie gebruiken, zodat u met dezelfde toepassingscode in verschillende omgevingen kunt werken.

  • U kunt het proces van het leren van het opbouwpatroon delegeren en deze client registreren bij de toepassingscontext naar het Spring Boot-framework. Met deze delegatie kunt u zich richten op het gebruik van de clients met uw eigen zakelijke vereisten.

  • U kunt de statusindicator op een eenvoudige manier gebruiken om de status en status van uw toepassing en interne onderdelen te controleren.

In het volgende codevoorbeeld ziet u hoe u deze twee alternatieven gebruikt ServiceBusSenderClient en ServiceBusProcessorClient gebruikt.

Notitie

Azure Java SDK voor Service Bus biedt meerdere clients om te communiceren met Service Bus. De starter biedt ook automatische configuratie voor alle Service Bus-clients en clientbouwers. Hier gebruiken we alleen ServiceBusSenderClient en ServiceBusProcessorClient als voorbeelden.

Spring Boot AutoConfiguration gebruiken

Als u berichten wilt verzenden naar en ontvangen van Service Bus, configureert u de toepassing met behulp van de volgende stappen:

  1. Configureer uw Service Bus-naamruimte en -wachtrij, zoals wordt weergegeven in het volgende voorbeeld:

    spring.cloud.azure.servicebus.namespace=<your-servicebus-namespace-name>
    spring.cloud.azure.servicebus.entity-name=<your-servicebus-queue-name>
    spring.cloud.azure.servicebus.entity-type=queue
    

    Tip

    Hier gebruiken we Service Bus-wachtrij als voorbeeld. Als u onderwerp/abonnement wilt gebruiken, moet u de spring.cloud.azure.servicebus.processor.subscription-name en spring.cloud.azure.servicebus.consumer.subscription-name eigenschappen toevoegen en de entity-type waarde wijzigen in topic.

  2. Maak een nieuwe ServiceBusProcessorClientConfiguration Java-klasse, zoals wordt weergegeven in het volgende voorbeeld. Deze klasse wordt gebruikt om het bericht en de fouthandler van ServiceBusProcessorClient.

    @Configuration(proxyBeanMethods = false)
    public class ServiceBusProcessorClientConfiguration {
    
        @Bean
        ServiceBusRecordMessageListener processMessage() {
            return context -> {
                ServiceBusReceivedMessage message = context.getMessage();
                System.out.printf("Processing message. Id: %s, Sequence #: %s. Contents: %s%n", message.getMessageId(),
                        message.getSequenceNumber(), message.getBody());
            };
        }
    
        @Bean
        ServiceBusErrorHandler processError() {
            return context -> {
                System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n",
                        context.getFullyQualifiedNamespace(), context.getEntityPath());
            };
        }
    }
    
  3. Injecteer de ServiceBusSenderClient spring-toepassing en roep de gerelateerde API's aan om berichten te verzenden, zoals wordt weergegeven in het volgende voorbeeld:

    @SpringBootApplication
    public class ServiceBusQueueApplication implements CommandLineRunner {
    
        private final ServiceBusSenderClient senderClient;
    
        public ServiceBusQueueApplication(ServiceBusSenderClient senderClient) {
            this.senderClient = senderClient;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceBusQueueApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            // send one message to the queue
            senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
            System.out.printf("Sent a message to the queue");
            senderClient.close();
    
            // wait the processor client to consume messages
            TimeUnit.SECONDS.sleep(10);
        }
    
    }
    

    Notitie

    Standaard wordt de levenscyclus van de autowired ServiceBusProcessorClient bean beheerd door de Spring-context. De processor wordt automatisch gestart wanneer de Spring Application Context wordt gestart en gestopt wanneer de Spring Application Context stopt. Als u deze functie wilt uitschakelen, configureert u spring.cloud.azure.servicebus.processor.auto-startup=false.

  4. Start de toepassing. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:

    Sent a message to the queue
    Processing message. Id: 6f405435200047069a3caf80893a80bc, Sequence #: 1. Contents: Hello, World!
    

Service Bus-clients programmatisch bouwen

U kunt die clientbonen zelf bouwen, maar het proces is ingewikkeld. In Spring Boot-toepassingen moet u eigenschappen beheren, het opbouwpatroon leren en de client registreren bij de context van uw Spring-toepassing. In het volgende codevoorbeeld ziet u hoe u dit doet:

  1. Maak een nieuwe ServiceBusClientConfiguration Java-klasse, zoals wordt weergegeven in het volgende voorbeeld. Deze klasse wordt gebruikt om de ServiceBusSenderClient en ServiceBusProcessorClient bonen te declareren.

    @Configuration(proxyBeanMethods = false)
    public class ServiceBusClientConfiguration {
    
        private static final String SERVICE_BUS_FQDN = "<service-bus-fully-qualified-namespace>";
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        @Bean
        ServiceBusClientBuilder serviceBusClientBuilder() {
            return new ServiceBusClientBuilder()
                       .fullyQualifiedNamespace(SERVICE_BUS_FQDN)
                       .credential(new DefaultAzureCredentialBuilder().build());
        }
    
        @Bean
        ServiceBusSenderClient serviceBusSenderClient(ServiceBusClientBuilder builder) {
            return builder
                   .sender()
                   .queueName(QUEUE_NAME)
                   .buildClient();
        }
    
        @Bean
        ServiceBusProcessorClient serviceBusProcessorClient(ServiceBusClientBuilder builder) {
            return builder.processor()
                          .queueName(QUEUE_NAME)
                          .processMessage(ServiceBusClientConfiguration::processMessage)
                          .processError(ServiceBusClientConfiguration::processError)
                          .buildProcessorClient();
        }
    
        private static void processMessage(ServiceBusReceivedMessageContext context) {
            ServiceBusReceivedMessage message = context.getMessage();
            System.out.printf("Processing message. Id: %s, Sequence #: %s. Contents: %s%n",
                message.getMessageId(), message.getSequenceNumber(), message.getBody());
        }
    
        private static void processError(ServiceBusErrorContext context) {
            System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n",
                    context.getFullyQualifiedNamespace(), context.getEntityPath());
        }
    }
    

    Notitie

    Zorg ervoor dat u de tijdelijke aanduiding vervangt door uw <service-bus-fully-qualified-namespace> Service Bus-hostnaam in Azure Portal. Vervang de <service-bus-queue-name> tijdelijke aanduiding door uw eigen wachtrijnaam die is geconfigureerd in uw Service Bus-naamruimte.

  2. Injecteer de clientbonen in uw toepassing, zoals wordt weergegeven in het volgende voorbeeld:

    @SpringBootApplication
    public class ServiceBusQueueApplication implements CommandLineRunner {
    
        private final ServiceBusSenderClient senderClient;
    
        private final ServiceBusProcessorClient processorClient;
    
        public ServiceBusQueueApplication(ServiceBusSenderClient senderClient, ServiceBusProcessorClient processorClient) {
            this.senderClient = senderClient;
            this.processorClient = processorClient;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceBusQueueApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            // send one message to the queue
            senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
            System.out.printf("Sent a message to the queue");
            senderClient.close();
    
            System.out.printf("Starting the processor");
            processorClient.start();
            TimeUnit.SECONDS.sleep(10);
            System.out.printf("Stopping and closing the processor");
            processorClient.close();
        }
    
    }
    
  3. Start de toepassing. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:

    Sent a message to the queue
    Starting the processor
    ...
    Processing message. Id: 6f405435200047069a3caf80893a80bc, Sequence #: 1. Contents: Hello, World!
    Stopping and closing the processor
    

In de volgende lijst ziet u redenen waarom deze code niet flexibel of correct is:

  • De naamruimte en wachtrij-/onderwerp-/abonnementsnamen zijn in code vastgelegd.
  • Als u @Value configuraties uit de Spring-omgeving wilt ophalen, kunt u geen IDE-hints hebben in het bestand application.properties .
  • Als u een microservicescenario hebt, moet u de code in elk project dupliceren en het is eenvoudig om fouten te maken en moeilijk consistent te zijn.

Gelukkig is het bouwen van de clientbonen zelf niet nodig met Spring Cloud Azure. In plaats daarvan kunt u de bonen rechtstreeks injecteren en de configuratie-eigenschappen gebruiken waarmee u al bekend bent om Service Bus te configureren.

Spring Cloud Azure biedt ook de volgende globale configuraties voor verschillende scenario's. Zie de sectie Globale configuratie voor Azure Service SDK's van de Spring Cloud Azure-configuratie voor meer informatie.

  • Proxyopties.
  • Opties voor opnieuw proberen.
  • AMQP-transportclientopties.

U kunt ook verbinding maken met verschillende Azure-clouds. Zie Verbinding maken naar verschillende Azure-clouds voor meer informatie.

Spring Cloud Azure Service Bus JMS Starter gebruiken

De Spring Cloud Azure Service Bus JMS Starter-module biedt Spring JMS-integratie met Service Bus. In de volgende video wordt beschreven hoe u Spring JMS-toepassingen integreert met Azure Service Bus met behulp van JMS 2.0.


Deze handleiding laat zien hoe u Spring Cloud Azure Service Bus Starter voor JMS API gebruikt om berichten te verzenden naar en te ontvangen van Service Bus.

De Service Bus-afhankelijkheid toevoegen

Als u de Spring Cloud Azure Service Bus JMS Starter-module wilt installeren, voegt u de volgende afhankelijkheden toe aan uw pom.xml-bestand :

  • De Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>5.12.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Notitie

    Als u Spring Boot 2.x gebruikt, moet u de spring-cloud-azure-dependencies versie instellen op 4.18.0. Deze stuklijst (Bill of Material) moet worden geconfigureerd in de <dependencyManagement> sectie van uw pom.xml-bestand . Dit zorgt ervoor dat alle Spring Cloud Azure-afhankelijkheden dezelfde versie gebruiken. Zie welke versie van Spring Cloud Azure moet ik gebruiken voor meer informatie over de versie die voor deze BOM wordt gebruikt.

  • Het Spring Cloud Azure Service Bus JMS-artefact:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>
    </dependency>
    

Codeer de toepassing om berichten te verzenden en te ontvangen

  1. Configureer de verbindingsreeks en prijscategorie voor uw Service Bus, zoals wordt weergegeven in het volgende voorbeeld:

    spring.jms.servicebus.connection-string=<service-bus-namespace-connection-string>
    spring.jms.servicebus.pricing-tier=<service-bus-pricing-tier>
    
  2. Maak de ontvanger van het bericht.

    Spring biedt de middelen om berichten te publiceren naar een POJO (Plain Old Java Object). Definieer eerst een algemene User klasse waarin de naam van de gebruiker wordt opgeslagen en opgehaald, zoals wordt weergegeven in het volgende voorbeeld:

    public class User implements Serializable {
    
        private static final long serialVersionUID = -295422703255886286L;
    
        private String name;
    
        public User() {
        }
    
        public User(String name) {
            setName(name);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    Tip

    Serializable wordt geïmplementeerd om de methode send in JmsTemplate in het Spring-framework te gebruiken. Anders moet u een aangepaste MessageConverter bean definiëren om de inhoud te serialiseren naar JSON in tekstindeling. Zie het officiële Spring JMS Start-project voor meer informatie over MessageConverter.

  3. Hier kunt u een nieuwe QueueReceiveService Java-klasse maken, zoals wordt weergegeven in het volgende voorbeeld. Deze klasse wordt gebruikt om een ontvanger van een bericht te definiëren.

    @Component
    public class QueueReceiveService {
    
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        @JmsListener(destination = QUEUE_NAME, containerFactory = "jmsListenerContainerFactory")
        public void receiveMessage(User user) {
            System.out.printf("Received a message from %s.", user.getName());
        }
    }
    

    Notitie

    Vervang de tijdelijke aanduiding door uw <service-bus-queue-name> eigen wachtrijnaam die is geconfigureerd in uw Service Bus-naamruimte.

    Als u een onderwerp/abonnement gebruikt, wijzigt u de destination parameter als onderwerpnaam en moet u de containerFactory parameter als onderwerpnaam wijzigen topicJmsListenerContainerFactory. Voeg ook de subscription parameter toe om de abonnementsnaam te beschrijven.

  4. Verbind een afzender en een ontvanger om berichten te verzenden en te ontvangen met Spring, zoals wordt weergegeven in het volgende voorbeeld:

    @SpringBootApplication
    @EnableJms
    public class ServiceBusJmsStarterApplication {
    
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        public static void main(String[] args) {
            ConfigurableApplicationContext context = SpringApplication.run(ServiceBusJMSQueueApplication.class, args);
            JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
    
            // Send a message with a POJO - the template reuse the message converter
            System.out.println("Sending a user message.");
            jmsTemplate.convertAndSend(QUEUE_NAME, new User("Tom"));
        }
    }
    

    Notitie

    Vervang de tijdelijke aanduiding door uw <service-bus-queue-name> eigen wachtrijnaam die is geconfigureerd in uw Service Bus-naamruimte.

    Tip

    Zorg ervoor dat u de @EnableIntegration aantekening toevoegt, waardoor de detectie van methoden @JmsListenermet aantekeningen wordt geactiveerd, waardoor de container voor de berichtlistener onder de covers wordt gemaakt.

  5. Start de toepassing. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:

    Sending a user message.
    Received a message from Tom.
    

Overige informatie

Zie JMS-API gebruiken met Service Bus en AMQP 1.0 voor meer informatie.

Spring Messaging Azure Service Bus gebruiken

De Spring Messaging Azure Service Bus-module biedt ondersteuning voor Spring Messaging-framework met Service Bus.

Als u Spring Messaging Azure Service Bus gebruikt, kunt u de volgende functies gebruiken:

  • ServiceBusTemplate: berichten asynchroon en synchroon verzenden naar Service Bus-wachtrijen en onderwerpen.
  • @ServiceBusListener: een methode markeren als het doel van een Service Bus-berichtlistener op het doel.

Deze handleiding laat zien hoe u Spring Messaging Azure Service Bus gebruikt om berichten te verzenden naar en te ontvangen van Service Bus.

De Service Bus-afhankelijkheid toevoegen

Als u de Spring Messaging Azure Service Bus-module wilt installeren, voegt u de volgende afhankelijkheden toe aan uw pom.xml-bestand :

  • De Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>5.12.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Notitie

    Als u Spring Boot 2.x gebruikt, moet u de spring-cloud-azure-dependencies versie instellen op 4.18.0. Deze stuklijst (Bill of Material) moet worden geconfigureerd in de <dependencyManagement> sectie van uw pom.xml-bestand . Dit zorgt ervoor dat alle Spring Cloud Azure-afhankelijkheden dezelfde versie gebruiken. Zie welke versie van Spring Cloud Azure moet ik gebruiken voor meer informatie over de versie die voor deze BOM wordt gebruikt.

  • De Spring Messaging Service Bus- en Spring Cloud Azure-starterartefacten:

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

Codeer de toepassing om berichten te verzenden en te ontvangen

  1. Configureer de naamruimte en het wachtrijtype voor uw Service Bus, zoals wordt weergegeven in het volgende voorbeeld:

    spring.cloud.azure.servicebus.namespace=<service-bus-namespace-name>
    spring.cloud.azure.servicebus.entity-type=queue
    

    Notitie

    Als u een onderwerp/abonnement gebruikt, wijzigt u de spring.cloud.azure.servicebus.entity-type waarde in topic.

  2. Maak een nieuwe ConsumerService Java-klasse, zoals wordt weergegeven in het volgende voorbeeld. Deze klasse wordt gebruikt om een ontvanger van een bericht te definiëren.

    @Service
    public class ConsumerService {
    
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        @ServiceBusListener(destination = QUEUE_NAME)
        public void handleMessageFromServiceBus(String message) {
            System.out.printf("Consume message: %s%n", message);
        }
    
    }
    

    Notitie

    Als u een onderwerp/abonnement gebruikt, wijzigt u de aantekeningsparameter als destination onderwerpnaam en voegt u de parameter toe om de subscription abonnementsnaam te beschrijven.

  3. Verbind een afzender en een ontvanger om berichten te verzenden en te ontvangen met Spring, zoals wordt weergegeven in het volgende voorbeeld:

    @SpringBootApplication
    @EnableAzureMessaging
    public class Application {
    
        private static final String QUEUE_NAME = "<service-bus-queue-name>";
    
        public static void main(String[] args) {
            ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class);
            ServiceBusTemplate serviceBusTemplate = applicationContext.getBean(ServiceBusTemplate.class);
            System.out.println("Sending a message to the queue.");
            serviceBusTemplate.sendAsync(QUEUE_NAME, MessageBuilder.withPayload("Hello world").build()).subscribe();
        }
    }
    

    Tip

    Zorg ervoor dat u de @EnableAzureMessaging aantekening toevoegt, waardoor de detectie van methoden @ServiceBusListenermet aantekeningen wordt geactiveerd, waardoor de container voor de berichtlistener onder de covers wordt gemaakt.

  4. Start de toepassing. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:

    Sending a message to the queue.
    Consume message: Hello world.
    

Spring Integration Azure Service Bus gebruiken

De Spring Integration Azure Service Bus-module biedt ondersteuning voor het Spring Integration-framework met Service Bus.

Als uw Spring-toepassing Spring Integration-berichtkanalen gebruikt, kunt u berichten routeren tussen uw berichtkanalen en Service Bus met behulp van kanaaladapters.

Een inkomende kanaaladapter stuurt berichten van een Service Bus-wachtrij of -abonnement door naar een berichtkanaal. Een uitgaande kanaaladapter publiceert berichten van een berichtkanaal naar een Service Bus-wachtrij en -onderwerp.

Deze handleiding laat zien hoe u Spring Integration Azure Service Bus gebruikt om berichten te verzenden naar en te ontvangen van Service Bus.

De Service Bus-afhankelijkheid toevoegen

Als u de Spring Cloud Azure Service Bus Integration Starter-module wilt installeren, voegt u de volgende afhankelijkheden toe aan uw pom.xml-bestand :

  • De Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>5.12.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Notitie

    Als u Spring Boot 2.x gebruikt, moet u de spring-cloud-azure-dependencies versie instellen op 4.18.0. Deze stuklijst (Bill of Material) moet worden geconfigureerd in de <dependencyManagement> sectie van uw pom.xml-bestand . Dit zorgt ervoor dat alle Spring Cloud Azure-afhankelijkheden dezelfde versie gebruiken. Zie welke versie van Spring Cloud Azure moet ik gebruiken voor meer informatie over de versie die voor deze BOM wordt gebruikt.

  • Het Spring Cloud Azure Service Bus-integratieartefact:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-integration-servicebus</artifactId>
    </dependency>
    

Codeer de toepassing om berichten te verzenden en te ontvangen

  1. Configureer de naamruimte van uw Service Bus, zoals wordt weergegeven in het volgende voorbeeld:

    spring.cloud.azure.servicebus.namespace=<your-servicebus-namespace-name>
    
  2. Maak een nieuwe QueueReceiveConfiguration Java-klasse, zoals wordt weergegeven in het volgende voorbeeld. Deze klasse wordt gebruikt om een ontvanger van een bericht te definiëren.

    @Configuration
    public class QueueReceiveConfiguration {
    
        private static final String INPUT_CHANNEL = "queue.input";
        private static final String QUEUE_NAME = "<your-servicebus-queue-name>";
        private static final String SERVICE_BUS_MESSAGE_LISTENER_CONTAINER = "queue-listener-container";
    
        /**
         * This message receiver binding with {@link ServiceBusInboundChannelAdapter}
         * via {@link MessageChannel} has name {@value INPUT_CHANNEL}
         */
        @ServiceActivator(inputChannel = INPUT_CHANNEL)
        public void messageReceiver(byte[] payload) {
            String message = new String(payload);
            System.out.printf("New message received: '%s'%n", message);
        }
    
        @Bean(SERVICE_BUS_MESSAGE_LISTENER_CONTAINER)
        public ServiceBusMessageListenerContainer messageListenerContainer(ServiceBusProcessorFactory processorFactory) {
            ServiceBusContainerProperties containerProperties = new ServiceBusContainerProperties();
            containerProperties.setEntityName(QUEUE_NAME);
            return new ServiceBusMessageListenerContainer(processorFactory, containerProperties);
        }
    
        @Bean
        public ServiceBusInboundChannelAdapter queueMessageChannelAdapter(
            @Qualifier(INPUT_CHANNEL) MessageChannel inputChannel,
            @Qualifier(SERVICE_BUS_MESSAGE_LISTENER_CONTAINER) ServiceBusMessageListenerContainer listenerContainer) {
            ServiceBusInboundChannelAdapter adapter = new ServiceBusInboundChannelAdapter(listenerContainer);
            adapter.setOutputChannel(inputChannel);
            return adapter;
        }
    
        @Bean(name = INPUT_CHANNEL)
        public MessageChannel input() {
            return new DirectChannel();
        }
    }
    
  3. Maak een nieuwe QueueSendConfiguration Java-klasse, zoals wordt weergegeven in het volgende voorbeeld. Deze klasse wordt gebruikt om een afzender van een bericht te definiëren.

    @Configuration
    public class QueueSendConfiguration {
    
        private static final String OUTPUT_CHANNEL = "queue.output";
        private static final String QUEUE_NAME = "<your-servicebus-queue-name>";
    
        @Bean
        @ServiceActivator(inputChannel = OUTPUT_CHANNEL)
        public MessageHandler queueMessageSender(ServiceBusTemplate serviceBusTemplate) {
            serviceBusTemplate.setDefaultEntityType(ServiceBusEntityType.QUEUE);
            DefaultMessageHandler handler = new DefaultMessageHandler(QUEUE_NAME, serviceBusTemplate);
            handler.setSendCallback(new ListenableFutureCallback<Void>() {
                @Override
                public void onSuccess(Void result) {
                    System.out.println("Message was sent successfully.");
                }
    
                @Override
                public void onFailure(Throwable ex) {
                    System.out.println("There was an error sending the message.");
                }
            });
    
            return handler;
        }
    
        /**
         * Message gateway binding with {@link MessageHandler}
         * via {@link MessageChannel} has name {@value OUTPUT_CHANNEL}
         */
        @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)
        public interface QueueOutboundGateway {
            void send(String text);
        }
    }
    
  4. Verbind een afzender en een ontvanger om berichten te verzenden en te ontvangen met Spring, zoals wordt weergegeven in het volgende voorbeeld:

    @SpringBootApplication
    @EnableIntegration
    @Configuration(proxyBeanMethods = false)
    public class ServiceBusIntegrationApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext applicationContext = SpringApplication.run(ServiceBusIntegrationApplication.class, args);
            QueueSendConfiguration.QueueOutboundGateway outboundGateway = applicationContext.getBean(QueueSendConfiguration.QueueOutboundGateway.class);
            System.out.println("Sending a message to the queue");
            outboundGateway.send("Hello World");
        }
    
    }
    

    Tip

    Zorg ervoor dat u de @EnableIntegration aantekening toevoegt, waardoor de Spring Integration-infrastructuur mogelijk is.

  5. Start de toepassing. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:

    Message was sent successfully.
    New message received: 'Hello World'
    

Spring Cloud Stream Service Bus Binder gebruiken

Als u de Service Bus-API wilt aanroepen in een Spring Cloud Stream-toepassing , gebruikt u de Module Spring Cloud Azure Service Bus Stream Binder.

Deze handleiding laat zien hoe u Spring Cloud Stream Service Bus Binder gebruikt om berichten te verzenden naar en te ontvangen van Service Bus.

De Service Bus-afhankelijkheid toevoegen

Als u de Spring Cloud Azure Service Bus Stream Binder-module wilt installeren, voegt u de volgende afhankelijkheden toe aan uw pom.xml-bestand :

  • De Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>5.12.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Notitie

    Als u Spring Boot 2.x gebruikt, moet u de spring-cloud-azure-dependencies versie instellen op 4.18.0. Deze stuklijst (Bill of Material) moet worden geconfigureerd in de <dependencyManagement> sectie van uw pom.xml-bestand . Dit zorgt ervoor dat alle Spring Cloud Azure-afhankelijkheden dezelfde versie gebruiken. Zie welke versie van Spring Cloud Azure moet ik gebruiken voor meer informatie over de versie die voor deze BOM wordt gebruikt.

  • Het Spring Cloud Azure Service Bus-integratieartefact:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>
    </dependency>
    

Codeer de toepassing om berichten te verzenden en te ontvangen

  1. Configureer de naamruimte van uw Service Bus, zoals wordt weergegeven in het volgende voorbeeld:

    spring.cloud.azure.servicebus.namespace=<service-bus-namespace-name>
    
  2. Maak de ontvanger van het bericht.

    Als u uw toepassing wilt gebruiken als een gebeurtenissink, configureert u de invoerbinding door de volgende informatie op te geven:

    • Declareer een Consumer bean die berichtafhandelingslogica definieert. De volgende Consumer bean heeft bijvoorbeeld de naam consume:

      @Bean
      public Consumer<Message<String>> consume() {
          return message -> {
              System.out.printf("New message received: '%s'.%n", message.getPayload());
          };
      }
      
    • Voeg de configuratie toe om de queue naam op te geven die moet worden gebruikt door de <service-bus-queue-name> tijdelijke aanduiding te vervangen, zoals wordt weergegeven in het volgende voorbeeld:

      # name for the `Consumer` bean
      spring.cloud.function.definition=consume
      spring.cloud.stream.bindings.consume-in-0.destination=<service-bus-queue-name>
      

      Notitie

      Als u een Service Bus-abonnement wilt gebruiken, moet u de bindingseigenschappen consume-in-0 wijzigen, zoals wordt weergegeven in het volgende voorbeeld:

      spring.cloud.stream.bindings.consume-in-0.destination=<service-bus-topic-name>
      spring.cloud.stream.bindings.consume-in-0.group=<service-bus-subscription-name>
      
  3. Maak de afzender van het bericht.

    Als u uw toepassing wilt gebruiken als gebeurtenisbron, configureert u de uitvoerbindinger door de volgende informatie op te geven:

    • Definieer een Supplier bean die definieert waar berichten vandaan komen in uw toepassing.

      @Bean
      return () -> {
              System.out.println("Sending a message.");
              return MessageBuilder.withPayload("Hello world").build();
          };
      }
      
    • Voeg de configuratie toe om de queue naam voor het verzenden op te geven door de <your-servicebus-queue-name> tijdelijke aanduiding in het volgende voorbeeld te vervangen:

      # "consume" is added from the previous step
      spring.cloud.function.definition=consume;supply
      spring.cloud.stream.bindings.supply-out-0.destination=<your-servicebus-queue-name>
      spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=queue
      

      Notitie

      Als u naar een Service Bus-onderwerp wilt verzenden, moet u het entity-type onderwerp wijzigen in topic.

  4. Start de toepassing. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:

    Sending a message.
    New message received: 'Hello world'.
    

Implementeren in Azure Spring Apps

Nu de Spring Boot-toepassing lokaal wordt uitgevoerd, is het tijd om deze naar productie te verplaatsen. Met Azure Spring Apps kunt u Eenvoudig Spring Boot-toepassingen implementeren in Azure zonder codewijzigingen. De service beheert de infrastructuur van Spring-toepassingen, zodat ontwikkelaars zich kunnen richten op hun code. Azure Spring Apps biedt levenscyclusbeheer met uitgebreide bewaking en diagnose, configuratiebeheer, servicedetectie, CI/CD-integratie, blauwgroene implementaties en meer. Zie Uw eerste toepassing implementeren in Azure Spring Apps om uw toepassing te implementeren in Azure Spring Apps.

Volgende stappen

Zie ook

Zie Wat is Spring Cloud Azure voor meer informatie over meer Spring Boot Starters die beschikbaar zijn voor Microsoft Azure ?