В памяти ActiveMQ пытается ответить на временную очередь до ее полного создания? - PullRequest
0 голосов
/ 24 сентября 2011

У нас есть сценарий, в котором нам нужно отправить синхронное сообщение через нашего in-memory activemq брокера.Наш синхронный код на стороне клиента выглядит следующим образом:

Session responseSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
TemporaryQueue responseQ = responseSession.createTemporaryQueue();
msg.setJMSReplyTo(responseQ);
QueueReceiver qReceiver = ((QueueSession) responseSession).createReceiver(responseQ);
sendMessage(msg, false, timeout);
Message response = qReceiver.receive(timeout);

В большинстве случаев наш серверный код ответа работает нормально, но иногда мы получаем трассировку стека, например:

javax.jms.InvalidDestinationException: Cannot publish to a deleted Destination: temp-queue://ID:<removed>
at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1632)
at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:231)
at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:269)

Я подозреваю, чтоОсновная проблема заключается в том, что временная очередь не полностью настроена или что она не была опубликована или что-то еще происходит, когда служба пытается опубликовать в ней сообщение.В своем коде сервера я поместил вызов send в цикл, перехватывающий исключение InvalidDestinationException, спящий секунду и повторяющий попытку до тех пор, пока он не завершится успешно.Так как я добавил это, всякий раз, когда я вижу исключение во второй попытке, это работает.

Я делаю что-то не так?Должен ли я что-то делать на клиенте для синхронизации или очистки или иным образом убедиться, что временная очередь активна перед отправкой сообщения на сервер?Есть ли что-то еще, что я должен делать на стороне сервера, чтобы убедиться, что очередь работает?Могу ли я в противном случае безопасно попытаться создать временную очередь на стороне сервера, если он считает, что ее там еще нет?

Примечание. Мы использовали ActiveMQ 5.3.0, но сегодня я попробовал 5.5.0 с теми же результатами..

1 Ответ

0 голосов
/ 24 сентября 2011

Это довольно странно, и я не думаю, что это должно происходить, поскольку временное назначение создается локально и должно быть на карте Соединений временных назначений.Если вы можете создать простой тестовый пример JUnit, который демонстрирует проблему, вам следует открыть новый Jira и прикрепить его для проверки.

...