весна Amqp ReplyRequiredException

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

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, или все должно быть в порядке?

Благодарю вас


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


Ответы (1)


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

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

Если у вас есть простой восходящий поток <gateway/> от шлюза AMQP, вам необходимо убедиться, что заголовок replyChannel не потерян. См. Header Channel Registry в этом разделе .

person Gary Russell    schedule 07.10.2014
comment
Привет, Гэри, спасибо, не могли бы вы помочь понять, чем отличается наличие отдельного входящего адаптера для получения ответа и ответного канала в исходящем шлюзе. Не будет ли у входящего адаптера открыт сокет (следовательно, поток) для получения ответа? - person Mark1234; 08.10.2014
comment
Да, но ответ должен быть соотнесен с запросом, что происходит автоматически в шлюзе, и вы должны делать это вручную при использовании двух отдельных асинхронных конечных точек; будет один поток (по умолчанию) для обработки всех ответов, а не вешать поток для каждого ответа. Как я уже сказал, мне нужно увидеть больше вашего потока, чтобы дать конкретный совет, если вы ожидаете, что у вас будет много одновременных запросов. - person Gary Russell; 08.10.2014