Spring Boot: обмен сообщениями, AMQP, RabbitMQ, отправка и получение сообщения
Отправка сообщения
Spring AmqpTemplate и AmqpAdmin настраиваются автоматически, и вы можете автоматически связывать их непосредственно с вашими компонентами, как показано в следующем примере:
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;
}
// ...
}
RabbitMessagingTemplate может быть введен аналогичным образом. Если bean-компонент MessageConverter определен, он автоматически связывается с автоматически настроенным AmqpTemplate.
При необходимости любой org.springframework.amqp.core.Queue, определенный как bean-компонент, автоматически используется для объявления соответствующей очереди в экземпляре RabbitMQ.
Чтобы повторить операции, вы можете включить повторные попытки на AmqpTemplate (например, в случае потери соединения с брокером):
spring.rabbitmq.template.retry.enabled=true
spring.rabbitmq.template.retry.initial-interval=2s
Повторные попытки отключены по умолчанию. Вы также можете настроить RetryTemplate программно, объявив bean-компонент RabbitRetryTemplateCustomizer.
Получение сообщения
При наличии инфраструктуры Rabbit любой компонент может быть аннотирован @RabbitListener для создания конечной точки слушателя. Если RabbitListenerContainerFactory не был определен, автоматически настраивается SimpleRabbitListenerContainerFactory по умолчанию, и вы можете переключиться на прямой контейнер, используя свойство spring.rabbitmq.listener.type. Если определен MessageConverter или компонент MessageRecoverer, он автоматически связывается с фабрикой по умолчанию.
Следующий пример компонента создает конечную точку прослушивателя в очереди someQueue:
@Component
public class MyBean {
@RabbitListener(queues = "someQueue")
public void processMessage(String content) {
// ...
}
}
Если вам нужно создать больше экземпляров RabbitListenerContainerFactory или переопределить значение по умолчанию, Spring Boot предоставляет SimpleRabbitListenerContainerFactoryConfigurer и DirectRabbitListenerContainerFactoryConfigurer, которые можно использовать для инициализации SimpleRabbitListenerContainerFactory, и DirectRabbitListenerContainerFactory с теми же настройками, что и фабрики, используемые автоматической настройкой.
Неважно, какой тип контейнера вы выбрали. Эти два bean-компонента доступны для автоматической конфигурации.
Например, следующий класс конфигурации предоставляет другую фабрику, которая использует определенный MessageConverter:
@Configuration(proxyBeanMethods = false)
static class RabbitConfiguration {
@Bean
public SimpleRabbitListenerContainerFactory myFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer) {
SimpleRabbitListenerContainerFactory factory =
new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setMessageConverter(myMessageConverter());
return factory;
}
}
Затем вы можете использовать фабрику в любом аннотированном методе @RabbitListener следующим образом:
@Component
public class MyBean {
@RabbitListener(queues = "someQueue", containerFactory="myFactory")
public void processMessage(String content) {
// ...
}
}
Вы можете включить повторные попытки для обработки ситуаций, когда ваш слушатель генерирует исключение. По умолчанию используется RejectAndDontRequeueRecoverer, но вы можете определить собственный MessageRecoverer. Когда повторные попытки исчерпаны, сообщение отклоняется и либо удаляется, либо направляется на обмен недоставленными письмами, если посредник настроен на это. По умолчанию повторные попытки отключены. Вы также можете настроить RetryTemplate программно, объявив bean-компонент RabbitRetryTemplateCustomizer.
По умолчанию, если повторные попытки отключены и слушатель выдает исключение, доставка повторяется бесконечно. Вы можете изменить это поведение двумя способами: для свойства defaultRequeueRejected установить значение false, чтобы предпринимались попытки повторной доставки, или вызвать исключение AmqpRejectAndDontRequeueException, сигнализирующее об отклонении сообщения. Последний является механизмом, используемым, когда повторные попытки включены и достигнуто максимальное количество попыток доставки.
Читайте также:
- Spring Boot: обмен сообщениями, AMQP, поддержка RabbitMQ
- Spring Boot: обмен сообщениями, JMS, ActiveMQ
- Spring Boot: обмен сообщениями, JMS, отправка и получение сообщения
Комментарии
Отправить комментарий