2016-03-02 4 views
0

Мне нужно отправить и получить ack синхронно, и для этого я использую RabbitTemplate.RabbitTemplate не настроен как MessageListener

RabbitTemplate имеет очереди и replyAddress собственность, но при попытке отправить мне эту ошибку появляется:

java.lang.IllegalStateException: RabbitTemplate не настроен как MessageListener - не может использовать «replyAddress»: amq.gen-t1ESvGc4I8EfGJCjWjBxKw

Если я использую метод отправки вместо SendAndReceive то процесс является правильным, но ответ приходит асинхронно ко мне (у меня есть MessageListener для этого), но это не не то, что мне нужно.

Возможно ли, что я не могу использовать ту же самую очередь ответа для RabbitTemplate, что у меня для MessageListener?


Еще раз спасибо Гэри, и извините, потому что вопрос на самом деле непонятен.

У меня есть MessageListener, работающий правильно, когда я отправляю сообщение, но для некоторых сообщений мне нужен синхронный ответ. Когда я использую sendAndReceive метод, я получаю исключение:

java.lang.IllegalStateException: RabbitTemplate не настроен как MessageListener - не может использовать 'replyAddress': amq.gen-t1ESvGc4I8EfGJCjWjBxKw

И RabbitTemplate имеет свойство replyAddress: amq.gen-t1ESvGc4I8EfGJCjWjBxKw

Если я использую метод send, то ответ приходит асинхронно к MessageListener. Но для некоторых сообщений мне нужен синхронный ответ.

ответ

1

Ваш вопрос непонятен; если вы хотите синхронный ответ, используйте sendAndReceive; вызывающий поток будет блокироваться до получения ответа.

Нет, вы не можете использовать ту же очередь, что и слушатель, - они будут соревноваться за сообщения.

Если вы хотите, чтобы асинхронные отправки и получения, то replyToAddress может использоваться только с операциями sendAndReceive.

Если вы хотите сделать асинхронной передачи и приема, вы должны установить replyTo свойства (имя очереди или exchange/routingKey) в свойствах сообщения - перед вызовом send или в MessagePostProcessor при использовании sendAndReceive.

Вам необходимо настроить контейнер прослушивателя для получения ответов (которые, как вы сказали, у вас есть).

В настоящее время 1.6 release имеет AsyncRabbitTemplate, который имеет sendAndReceive методов, которые возвращают команду ListenableFuture; это удобство, которое обертывает RabbitTemplate и SimpleMessageListenerContainer для ответов.

EDIT

Вы не можете использовать ту же очередь ответа для синхронизации и асинхронных ответов.

При использовании фиксированной очереди ответа необходимо configure a reply listener container as described in the documentation.

Однако вам не нужно указывать очередь ответов; шаблон будет использовать Direct ReplyTo, если брокер поддерживает его (или временную очередь в противном случае).

Если вы должны использовать именованную очередь ответов (например, вам требуется HA или система ответа не использует свойство replyTo), тогда вы должны настроить прослушиватель ответа (с шаблоном, являющимся слушателем).

+0

Я добавил дополнительную информацию к вопросу. Асинхронный ответ работает правильно, проблема в том, что я ожидаю синхронный ответ. – jandres

+0

Я отредактировал свой ответ. –

+0

Спасибо, Гарри, ты всегда указываешь мне в правильном направлении. – jandres