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:
Met Spring Cloud Azure Service Bus Starter kunt u berichten verzenden en ontvangen met de Service Bus Java SDK-clientbibliotheek met Spring Boot-functies.
Met Spring Cloud Azure Service Bus JMS Starter kunt u de JMS-API gebruiken voor het verzenden en ontvangen van berichten met Service Bus-wachtrijen en -onderwerpen/abonnementen.
Met Spring Messaging Azure Service Bus kunt u communiceren met Service Bus via de Spring Messaging-API .
Met Spring Integration Azure Service Bus kunt u Spring Integration Message Channels verbinden met Service Bus.
Met Spring Cloud Stream Binder voor Service Bus kunt u Service Bus gebruiken als berichten-middleware in Spring Cloud Stream-toepassingen.
Vereisten
- Een Azure-abonnement (u kunt een gratis abonnement maken).
- Java Development Kit (JDK) versie 8 of hoger.
- Apache Maven, versie 3.0 of hoger.
- Een Azure Service Bus en wachtrij of onderwerp/abonnement. Als u er nog geen hebt, maakt u een Service Bus-wachtrij of -onderwerp. Zie Azure Portal gebruiken voor het maken van een Service Bus-naamruimte en een wachtrij of Azure Portal gebruiken om een Service Bus-onderwerp en abonnementen voor het onderwerp te maken.
- Als u geen Spring Boot-toepassing hebt, maakt u een Maven-project met de Spring Initializr. Zorg ervoor dat u Maven Project selecteert en onder Afhankelijkheden de Spring Web-afhankelijkheid toevoegt en vervolgens Java-versie 8 of hoger selecteert.
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 DefaultAzureCredential
van, 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 DefaultAzureCredential
voor . 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.19.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 op4.19.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:
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
eigenschap toevoegen en deentity-type
waarde wijzigen intopic
.Maak een nieuwe
ServiceBusProcessorClientConfiguration
Java-klasse, zoals wordt weergegeven in het volgende voorbeeld. Deze klasse wordt gebruikt om het bericht en de fouthandler vanServiceBusProcessorClient
.@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()); }; } }
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 uspring.cloud.azure.servicebus.processor.auto-startup=false
.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:
Maak een nieuwe
ServiceBusClientConfiguration
Java-klasse, zoals wordt weergegeven in het volgende voorbeeld. Deze klasse wordt gebruikt om deServiceBusSenderClient
enServiceBusProcessorClient
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.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(); } }
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 met 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.19.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 op4.19.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
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>
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 methodesend
inJmsTemplate
in het Spring-framework te gebruiken. Anders moet u een aangepasteMessageConverter
bean definiëren om de inhoud te serialiseren naar JSON in tekstindeling. Zie het officiële Spring JMS Start-project voor meer informatie overMessageConverter
.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 decontainerFactory
parameter als onderwerpnaam wijzigentopicJmsListenerContainerFactory
. Voeg ook desubscription
parameter toe om de abonnementsnaam te beschrijven.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@JmsListener
met aantekeningen wordt geactiveerd, waardoor de container voor de berichtlistener onder de covers wordt gemaakt.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.19.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 op4.19.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
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 intopic
.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 degroup
abonnementsnaam te beschrijven.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@ServiceBusListener
met aantekeningen wordt geactiveerd, waardoor de container voor de berichtlistener onder de covers wordt gemaakt.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.19.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 op4.19.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
Configureer de naamruimte van uw Service Bus, zoals wordt weergegeven in het volgende voorbeeld:
spring.cloud.azure.servicebus.namespace=<your-servicebus-namespace-name>
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(); } }
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); } }
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.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.19.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 op4.19.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
Configureer de naamruimte van uw Service Bus, zoals wordt weergegeven in het volgende voorbeeld:
spring.cloud.azure.servicebus.namespace=<service-bus-namespace-name>
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 volgendeConsumer
bean heeft bijvoorbeeld de naamconsume
:@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>
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 intopic
.
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 ?