2014-10-07 4 views
0

У меня есть запрос/ответ, реализованный с использованием интеграции весны и amqp. Запросы могут занять много времени, чтобы обработать (они могут занять даже час для некоторых случаев), по какой-то причине клиент бросает исключение -spring amqp ReplyRequiredException

Exception in thread "main" org.springframework.integration.handler.ReplyRequiredException: No reply produced by handler 'client', and its 'requiresReply' property is set to true. 

Мой клиент конфигурация ниже.

<int-amqp:outbound-gateway 
     id="client" 
     request-channel="in" 
     reply-channel="res" 
     exchange-name="reportingServer" 
     routing-key-expression="'report.req.'+headers.id" 
     amqp-template="amqpTemplate" requires-reply="true"> 
     </int-amqp:outbound-gateway> 

Я считаю, что значение ответа тайм-аута по умолчанию -1 означает ждать бесконечно, но не знаю, почему его не работает, любая помощь будет оценена.

Также есть ли какие-либо известные проблемы с реализацией таких длительных ожидающих операций в amqp, или это должно быть просто отлично?

Спасибо

+0

Таймаут настроен на amqpTemplate и работает без каких-либо проблем. Хотя я все равно буду знать, есть ли какие-либо проблемы в ожидании слишком долго или какой-либо другой конфигурации, спасибо. – Mark1234

ответ

1

Это будет хорошо до тех пор, пока вы не слишком много одновременных запросов - это не очень хорошо масштабируется, если у вас есть gazillions нити висит в ожидании ответа.

Если вам необходимо масштабировать его, вы можете разработать асинхронный эквивалент с парой исходящих и входящих адаптеров, но это немного больше, чем использование шлюза, и фактическая реализация будет зависеть от остальной части вашего потока. По существу вам нужно будет настроить заголовок replyTo, чтобы заставить ответ поступать во входящий адаптер.

Если у вас есть простой <gateway/> выше по течению от шлюза AMQP, вы должны быть уверены, что заголовок replyChannel не потерян. See Header Channel Registry in this section.

+0

Привет, Гэри, не могли бы вы помочь понять, как отличается отдельный входящий адаптер, чтобы получить ответный канал ответа ответа в исходящем шлюзе. Не будет ли входящий адаптер открыть сокет (следовательно, поток), чтобы получить ответ? – Mark1234

+0

Да, но ответ должен быть соотнесен с запросом, который происходит автоматически в шлюзе, и вы должны сделать это «вручную» при использовании двух отдельных конечных точек async; будет один поток (по умолчанию) для обработки всех ответов, а не для зависания потока для каждого ответа. Как я уже сказал, мне нужно будет больше узнать о вашем потоке, чтобы дать конкретные рекомендации, если вы ожидаете, что в процессе будет много одновременных запросов. –

Смежные вопросы