32.2 AMQP
The Advanced Message Queuing Protocol (AMQP) is a platform-neutral, wire-level protocol for message-oriented middleware. The Spring AMQP project applies core Spring concepts to the development of AMQP-based messaging solutions. Spring Boot offers several conveniences for working with AMQP via RabbitMQ, including the spring-boot-starter-amqp
‘Starter’.
32.2.1 RabbitMQ support
RabbitMQ is a lightweight, reliable, scalable and portable message broker based on the AMQP protocol. Spring uses RabbitMQ
to communicate using the AMQP protocol.
RabbitMQ configuration is controlled by external configuration properties in spring.rabbitmq.*
. For example, you might declare the following section in application.properties
:
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=secret
See RabbitProperties
for more of the supported options.
Tip | |
---|---|
Check Understanding AMQP, the protocol used by RabbitMQ for more details. |
32.2.2 Sending a message
Spring’s AmqpTemplate
and AmqpAdmin
are auto-configured and you can autowire them directly into your own beans:
import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; _@Component_ public class MyBean { private final AmqpAdmin amqpAdmin; private final AmqpTemplate amqpTemplate; _@Autowired_ public MyBean(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate) { this.amqpAdmin = amqpAdmin; this.amqpTemplate = amqpTemplate; } // ... }
Note | |
---|---|
RabbitMessagingTemplate can be injected in a similar manner. If a MessageConverter bean is defined, it is associated automatically to the auto-configured AmqpTemplate . |
Any org.springframework.amqp.core.Queue
that is defined as a bean will be automatically used to declare a corresponding queue on the RabbitMQ instance if necessary.
You can enable retries on the AmqpTemplate
to retry operations, for example in the event the broker connection is lost. Retries are disabled by default.
32.2.3 Receiving a message
When the Rabbit infrastructure is present, any bean can be annotated with @RabbitListener
to create a listener endpoint. If no RabbitListenerContainerFactory
has been defined, a default one is configured automatically. If a MessageConverter
beans is defined, it is associated automatically to the default factory.
The following component creates a listener endpoint on the someQueue
queue:
_@Component_ public class MyBean { _@RabbitListener(queues = "someQueue")_ public void processMessage(String content) { // ... } }
Tip | |
---|---|
Check the Javadoc of @EnableRabbit for more details. |
If you need to create more RabbitListenerContainerFactory
instances or if you want to override the default, Spring Boot provides a SimpleRabbitListenerContainerFactoryConfigurer
that you can use to initialize a SimpleRabbitListenerContainerFactory
with the same settings as the one that is auto-configured.
For instance, the following exposes another factory that uses a specific MessageConverter
:
_@Configuration_ static class RabbitConfiguration { _@Bean_ public SimpleRabbitListenerContainerFactory myFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setMessageConverter(myMessageConverter()); return factory; } }
Then you can use in any @RabbitListener
-annotated method as follows:
_@Component_ public class MyBean { @RabbitListener(queues = "someQueue", **containerFactory="myFactory"**) public void processMessage(String content) { // ... } }
You can enable retries to handle situations where your listener throws an exception. When retries are exhausted, the message will be rejected and either dropped or routed to a dead-letter exchange if the broker is configured so. Retries are disabled by default.
Important | |
---|---|
If retries are not enabled and the listener throws an exception, by default the delivery will be retried indefinitely. You can modify this behavior in two ways; set the defaultRequeueRejected property to false and zero re-deliveries will be attempted; or, throw an AmqpRejectAndDontRequeueException to signal the message should be rejected. This is the mechanism used when retries are enabled and the maximum delivery attempts are reached. |