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, сигнализирующее об отклонении сообщения. Последний является механизмом, используемым, когда повторные попытки включены и достигнуто максимальное количество попыток доставки.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки