#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).