Я столкнулся с ошибкой, из-за которой RabbitMQ иногда жалуется на "PRECONDITION_FAILED - потребитель быстрого ответа не существует", хотя, как вы можете видеть ниже, сообщение, которое я отправляю, не имеет быстрого ответа, ответ на null
. Около 50% времени сообщение будет отправлено в обмен/очередь, как я ожидаю, а остальные 50% времени я получаю эту ошибку, которая уничтожает сообщение. Я запускаю этот код в spring boot 1.3.6 с spring amqp 1.6.0. Сервер RabbitMQ версии 3.5.5 с Erlan 18.1. Я не могу обновить версии, так как это производственный код.
Мой код очень прост. Объявляю обмен ответами/очередь для дальнейшего общения.
amqpAdmin.declareExchange(exchange);
amqpAdmin.declareQueue(queue);
amqpAdmin.declareBinding(binding);
Я отправляю свое сообщение amqp на ключ обмена/маршрутизации темы обмена, но оно так и не доходит до него из-за следующей ошибки:
Publish Message Success: [MyObject], MessageProperties [headers={__TypeId__=com.do.comp.amqp}, timestamp=null, messageId=null, userId=null, appId=null, clusterId=null, type=null, correlationId=null, replyTo=null, contentType=application/json, contentEncoding=UTF-8, contentLength=97, deliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=null, receivedExchange=null, receivedRoutingKey=null, deliveryTag=0, messageCount=null]]
AMQP Connection 10.12.36.75:5672 [ERROR] org.springframework.amqp.rabbit.connection.CachingConnectionFactory.log(CachingConnectionFactory.java:1198) - Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - fast reply consumer does not exist, class-id=60, method-id=40)<br>
http-nio-8122-exec-7 [DEBUG] org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getCachedChannelProxy(CachingConnectionFactory.java:476) - Creating cached Rabbit Channel from AMQChannel(amqp://admin@10.12.36.75:5672/,3)<br>
http-nio-8122-exec-7 [DEBUG] org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1392) - Executing callback on RabbitMQ Channel: Cached Rabbit Channel: AMQChannel(amqp://admin@10.12.36.75:5672/,3), conn: Proxy@782534f9 Shared Rabbit Connection: SimpleConnection@74658797 [delegate=amqp://admin@10.12.36.75:5672/, localPort= 60282]
Затем я прослушиваю созданную мной очередь ответа, который никогда не придет:
rabbitTemplate.receive(queue);
Приведенная выше ошибка связана с очередями прямого ответа, и я не использую ее, мой заголовок сообщения для ответа равен нулю. Еще одна странность заключается в том, что мы запускаем именно этот jar-файл на трех разных серверах для тестирования и разработки, и только на одном из них, похоже, возникла проблема, но все они представляют собой одну и ту же версию всего. RabbitMQ v.3.5.5 Erland 18.1
Почему RabbitMQ выдает ошибку быстрого ответа, когда поле для ответа равно null?
Нам нужен код для воспроизведения. На уровне
RabbitTemplate
amq.rabbitmq.reply-to
используется только при выполненииsendAndReceive()
: docs.spring.io/spring-amqp/docs/1.6.11.RELEASE/reference/html/…. Вот обсуждение с командой RabbitMQ: groups.google.com/forum/#!topic/rabbitmq-users/2hWtpypT2sk. Возможно, вам нужен свежий канал публикации. Я имею в виду, что нельзя повторно использовать один и тот жеConnectionFactory
для получения и отправки.Вот также некоторая информация: coderhelper.com/questions/48823323/…