RabbitTemplate.invoke(OperationsCallBack) не генерирует исключения при обнаружении / возврате / тайм-ауте сообщений

#rabbitmq #amqp #spring-amqp

#rabbitmq #amqp #spring-amqp

Вопрос:

Я использую приведенный ниже код для ожидания подтверждения (ack / nack / returns / timeout) на том же канале.

введите описание изображения здесь
введите описание изображения здесь

Я отправляю неверный ключ маршрутизации, поэтому RabbitMQ должен выдать исключение в соответствии с приведенной ниже документацией api. Но я не получаю исключение из api.

введите описание изображения здесь

Мы используем тайм-аут для waitForConfirmsOrDie как (60 секунд) Может кто-нибудь, пожалуйста, подсказать, неверны ли мои ожидания от api.

Ответ №1:

Это не интуитивно понятно, но возвращенные сообщения не генерируют nack; положительный ack получен после возвращенного сообщения. Nacks возникают только в результате ошибки брокера или очереди, размер которой ограничен с установленным поведением переполнения reject-publish .

https://www.rabbitmq.com/confirms.html

Для сообщений, не подлежащих маршрутизации, брокер выдаст подтверждение, как только exchange подтвердит, что сообщение не будет перенаправлено ни в одну очередь (возвращает пустой список очередей). Если сообщение также опубликовано как обязательное, basic.return отправляется клиенту до basic.ack.

С помощью коррелированных подтверждений (не простых подтверждений) вы можете проверить, было ли возвращено сообщение, просмотрев данные корреляции после получения подтверждения.

Кроме того, когда включены как подтверждения, так и возвраты, CorrelationData заполняется возвращенным сообщением, если CorrelationData имеет уникальный идентификатор; это всегда так, по умолчанию, начиная с версии 2.3. Гарантируется, что возвращаемое сообщение устанавливается до того, как будущее будет установлено с помощью ack.

Комментарии:

1. Привет, Гэри, всегда ли так, что для возвращенного сообщения обратный вызов вызывается до confirmCallBack, независимо от способа отправки сообщений в rabbit (waitForConfirmsOrDie (синхронизация) / асинхронно)

2. У меня есть настройки обратных вызовов на RabbitTemplate в PostConstruct , для template.invoke Я также попытался передать ack / nack callbakcs, но я заметил, что обратные вызовы в шаблоне вызываются вместо обратных вызовов, переданных в template.invoke . Можно ли использовать asyncTemplate.convertSendAndReceive в качестве альтернативы

3. должны ли данные корреляции передаваться в waitForConfirmsOrDie? Согласно официальному документу spring, данные корреляции не были переданы

4. Нет; вы не должны использовать simple подтверждения с возвратами; correlated вместо этого используйте подтверждения; добавьте CorrelationData экземпляр в convertAndSend() и ждите его Future вместо вызова waitForConfirmsOrDie() . invoke() Полностью удалите вызов. Обратитесь к документации, на которую я вам указал. Когда future будет завершен, проверьте наличие возвращенного сообщения (а также ack Vs. nack).